hdu 4396 More lumber is required
题目大意:
n个点,m条双向边。给你起点s,终点t,以及k。问你从s到t至少得到k分的最短路。边有自环,且边可以重复走。边每走一次获得10分。
(1<=N<=5000)(0<=M<=100000) (1<=S, T<=N; 0<=K<=500)
题解:
二维spfa,d[x][j]表示到x这个点经过j条边的最短路,有个重要的优化是:当L>K时把它并入到走K条边的状态中。
比赛时一直用拆点+一维spfa写,一直TLE或MLE……方法整个错了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<utility>
using namespace std;
queue< pair<int,int> >q;
const int inf=1<<29;
const int maxn=1000000;
int to[maxn],edge[maxn],cap[maxn],next[maxn],d[5001][100];
bool v[5001][100];
int em,n,m,maxk;
inline int change(int x)
{if(x<=maxk)return x;else return maxk;
}
void addedge(int x,int y,int d)
{to[em]=y;cap[em]=d;next[em]=edge[x];edge[x]=em++;
}
void spfa(int s)
{for(int i=0;i<=n;i++)for(int j=0;j<=51;j++){d[i][j]=inf;v[i][j]=false;}d[s][0]=0;v[s][0]=true;q.push(make_pair(s,0));while(!q.empty()){int x=q.front().first,j=q.front().second;q.pop();int p=edge[x];while(p!=-1){if(d[x][j]+cap[p]<d[to[p]][change(j+1)]){d[to[p]][change(j+1)]=d[x][j]+cap[p];if(!v[to[p]][change(j+1)]){v[to[p]][change(j+1)]=true;q.push(make_pair(to[p],change(j+1)));}}p=next[p];}v[x][j]=false;}
}
int main()
{while(scanf("%d%d",&n,&m)!=EOF){em=0;memset(edge,-1,sizeof(edge));memset(next,-1,sizeof(next));for(int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);addedge(u,v,w);addedge(v,u,w);}int s,t;scanf("%d%d%d",&s,&t,&maxk);if(maxk%10==0)maxk=maxk/10;else maxk=(maxk/10)+1;spfa(s);if(d[t][maxk]<inf)printf("%d\n",d[t][maxk]);else printf("-1\n");}return 0;
}
hdu 4396 More lumber is required相关推荐
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
- Spring 自动装配及其注解
一.属性自动装配 首先,准备三个类,分别是User,Cat,Dog.其中User属性拥有Cat和Dog对象. 1 package com.hdu.autowire; 2 3 public class ...
- 【HDU - 1216 】Assistance Required (模拟,类似素数打表,不是素数问题!)
题干: After the 1997/1998 Southwestern European Regional Contest (which was held in Ulm) a large conte ...
- 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)
题干: CC always becomes very depressed at the end of this month, he has checked his credit card yester ...
- hdu 2838求逆序数开了两个数组
http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 6441 Find Integer 【费马大定理】
传送门:HDU 6441 Find Integer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- HDU题目分类大全【大集合】
基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056.105 ...
- HDU 4389 - X mod f(x)
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4389 2012多校,第9场,1010 . 问题是,询问区间内 存在多少个 哈沙德数(Harshad ...
- 转载:Hdu 题目分类
原址点击 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056. ...
最新文章
- 【超详细】手把手教你使用YOLOX进行物体检测(附数据集)
- 剖析Vue原理实现双向绑定MVVM
- 解决TensorBoard训练集和测试集指标只能分开显示的问题(基于Keras)
- IEEE802.11协议栈
- 大侠稍等!URL 中为何出现奇怪的字符
- MySQL(七)关于MySQL不同版本下临键锁锁定范围不同
- 正则表达式入门之使用元字符
- java输出毫秒时间
- java并发编程之正确地终止一个线程interrupt/interrupted
- Linux/Android之sar查看IO/CPU占用率
- CVPR 新规严禁审稿期间公开宣传论文,可发 arXiv,LeCun:疯了吧!
- 一个元素的偏移的方法
- java opencv教程_史上最全 java 集成 opencv 教程
- C#多个DataTable根据某一列匹配,其余字段相加求和的高效算法。
- 华为手机怎么隐藏按键图标_你的华为手机隐藏功能,待激活
- 已有一个排好序的数组,由键盘输入一个数,要求按原来的排序规律将其插入到数组中.
- accumulate 的用法
- HTTP HTTPS SSL TLS
- 幼儿园课程体系结构图_构建幼儿园创新课程体系的思考
- 项目经理必须知道的7种项目管理方案