Lunch Time
hdu4807:http://acm.hdu.edu.cn/showproblem.php?pid=4807
题意:给你n个点(0--n-1),点之间是有向边,0号点有k个人,现在0号点的k个人要到n-1号点。每条边有一个容量,就是单位时间内最多允许c个人通过,通过一条边需要一个单位时间,现在问你最后一个到达n-1号点最短的时间是多少。
题解:这题用到网络流。怎么用呢?首先建图,边的容量自然是原来的容量,费用肯定为1.接着,我们可以想。先选一条路径的话,我们肯定选择一条费用最少的,这里就是距离最短的一条,因为,如果选择其他的一条,当那一条到达时,这一条已经到达,不会影响最后一个人的到达,只会贡献人数的减少。所以肯定选择费用最少的一条。然后,直选一条行不?答案是不一定的,因为这一条仅仅是费用最少,但是容量不一定是最大的。当第一个人到达的时候,接下来每一秒都会有y个人到达,y是流量。所以我们遍历下一条,选择下一条的时候,前一条肯要选,因为前一条不会影响这一条,并且会减少人数,提高运输量。所以,我们要遍历所有可行路径。s[i]表示到第i条时候第一次可以运输的总人数,则可以退出递推关系系s[i]=y[i] +(d[i]-d[i-1])*sum[i-1],y[i]表示第i条可行路径的流量,sum[i-1]表示前i-1条额流量和,d[i]表示第i条路径的费用。然后求费用流的时候更新就可以了。但是还要注意k==0时候要特判。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<cmath> 7 #define inf 100000000 8 using namespace std; 9 const int E=1000000; 10 const int N=10002; 11 struct Node{ 12 int v, cap, cost, next; // re记录逆边的下标。 13 }edge[E]; 14 int n, m; 15 long long ans,people; 16 int k, head[N]; 17 int que[N], pre[N], dis[N]; 18 bool vis[N]; 19 void init(){//初始化 20 k=ans=0; 21 memset(head,-1,sizeof(head)); 22 } 23 void addEdge(int u, int v, int ca, int co){ 24 edge[k].v = v; 25 edge[k].cap = ca; 26 edge[k].cost = co; 27 edge[k].next = head[u]; 28 head[u] = k ++; 29 edge[k].v = u; 30 edge[k].cap = 0; 31 edge[k].cost = -co; 32 edge[k].next = head[v]; 33 head[v] = k ++; 34 } 35 bool spfa(){ // 源点为0,汇点为n。 36 int i; 37 for(i = 1; i <= n; i ++){ 38 dis[i] = inf; 39 vis[i] = false; 40 } 41 queue<int>Q; 42 Q.push(1); 43 dis[1]=0; 44 vis[1] = true; 45 while(!Q.empty()){ // 这里最好用队列,有广搜的意思,堆栈像深搜。 46 int u = Q.front(); 47 Q.pop(); 48 for(i = head[u]; i != -1; i = edge[i].next){ 49 int v = edge[i].v; 50 if(edge[i].cap && dis[v] > dis[u] + edge[i].cost){ 51 dis[v] = dis[u] + edge[i].cost; 52 pre[v] = i; 53 if(!vis[v]){ 54 vis[v] = true; 55 Q.push(v); 56 } 57 } 58 } 59 vis[u] = false; 60 } 61 if(dis[n] == inf) return false; 62 return true; 63 } 64 int end(){ 65 int u, p, sum = inf; 66 for(u = n; u != 1; u = edge[p^1].v){//0是超级源点 67 p = pre[u]; 68 sum = min(sum, edge[p].cap); 69 } 70 for(u = n; u != 1; u = edge[p^1].v){ 71 p = pre[u]; 72 edge[p].cap -= sum; 73 edge[p^1].cap += sum; 74 } 75 return sum; 76 } 77 int main(){ 78 int t1,t2,t3; 79 while(~scanf("%d%d%d",&n,&m,&people)&&n>0){ 80 init();//初始化 81 for(int i=1;i<=m;i++){ 82 scanf("%d%d%d",&t1,&t2,&t3); 83 t1++;t2++; 84 addEdge(t1,t2,t3,1);//无向图要建边两次 85 } 86 long long s=people,now=0,sum=0; 87 ans=inf; 88 while(spfa()){ 89 int y=end(); 90 s-=((long long)dis[n]-now)*sum+y; 91 if(s<0)s=0; 92 sum+=y;now=dis[n]; 93 long long temp=(long long)now+(long long)ceil(s*1.0/sum); 94 if(temp<ans)ans=temp; 95 } 96 if(people==0)ans=0; 97 if(ans==inf)printf("No solution\n"); 98 else 99 printf("%I64d\n",ans); 100 } 101 }
View Code
转载于:https://www.cnblogs.com/chujian123/p/3921563.html
Lunch Time相关推荐
- 少样本学习原理快速入门,并翻译《Free Lunch for Few-Shot Learning: Distribution Calibration》
ICLR2021 Oral<Free Lunch for Few-Shot Learning: Distribution Calibration> 利用一个样本估计类别数据分布 9行代码提 ...
- Late Lunch Talk: Time to consider using PacBio’s long read sequencing in your research?
Late Lunch Talk: Time to consider using PacBio's long read sequencing in your research? Late Lunch T ...
- Free Lunch for Few-Shot Learning: Distribution Calibration(ICLR 2021)
论文笔记 FSL 7]Free Lunch for Few-Shot Learning: Distribution Calibration(ICLR 2021) 下载地址 | 论文源码
- 水题 ZOJ 3875 Lunch Time
题目传送门 1 /* 2 水题:找排序找中间的价格,若有两个,选价格大的: 3 写的是有点搓:) 4 */ 5 #include <cstdio> 6 #include <iostr ...
- 机器学习著名定理之—No Free Lunch定理详解
引言 谈到机器学习一个非常著名的定理,那就不得不提 No Free Lunch 定理了.该定理核心思想是没有一种通用的学习算法可以在各种任务中都有很好的表现,需要对具体问题进行具体的分析.从原理出发去 ...
- 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP
[BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...
- 【原创翻译】The Free Lunch Is Over
微软C++大师Herb Sutter的文章<The Free Lunch Is Over>翻译,以前自己也经常翻译,但是都不会上传博客.个人很喜欢这篇文章,所以以此作为翻译生涯的开始. 免 ...
- hihoCoder 1092 : Have Lunch Together
题目大意:小hi和小ho去咖啡厅喝咖啡,咖啡厅可以看作是n * m的矩阵,每个点要么为空,要么被人.障碍物.椅子所占据,小hi和小ho想要找两个相邻的椅子.起初两个人都在同一个点,求两人到达满足要求的 ...
- Android集成一个新产品时,lunch的product name和device name注意事项
Android系统lunch一个当前的Product大概流程包括下面几个部分: 1. lunch确定TARGET_PRODUCT.一般位于vendor/device/build/target/prod ...
- 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(10)——天下没有免费午餐定理(No Free Lunch Theorem)
天下没有免费午餐定理(No Free Lunch Theorem) 周志华老师西瓜书的第一章就说到了这个定理,形象非严谨地说就是面对问题A,你精心挑选的一种算法X性能吊打某垃圾算法Y:那么问题空间里一 ...
最新文章
- Scanpy(二)对PBMC3k聚类
- 突发!Intel CEO 换帅,VMware CEO 将走马上任
- [Android开发常见问题-12] Android开发中debug.keystore如何使用。
- Android开发:Handler的简单使用(一)
- PyCharm配置anaconda环境 安装第三方库
- Portable PostgreSQL
- javascript canvas九宫格小程序
- c++基础:继承与组合!
- java.lang.UnsatifiedLinkError错误一例:在eclipse中启动应用报错
- QQ输入法 for iPhone2.3
- 前端H5面试题(总结)
- 电脑、手机常用分辨率
- html语言超链接提示,HTML超链接
- 数据库系统原理与应用教程(042)—— MySQL 查询(四):使用通配符构造查询条件
- Oracle监听服务启动失败案例
- 计算机网络协议,以太网帧格式
- 视频教程-《信息学竞赛-C语言》 DAY30-清华尹成老师-C/C++
- Linux 系统安全检查
- ffmpeg-nvenc
- java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@44f16719 is still active.
热门文章
- Problem H. 小凡与英雄救美
- 著名数据恢复工具有哪些是好用的
- 零基础学python鱼c-鱼C-小甲鱼 零基础入门学习Python 97节课程
- 记录下server的配置
- 外媒如何看鸿蒙系统实测,鸿蒙系统是否真的很难成功,为何外媒总是在不断的“贬低”它?...
- 粗读Image Projection Network: 3D to 2D Image Segmentation in OCTA Images
- Mybatis <choose> <when> <otherwise>
- AI翻译新思路,OBTranslate打破非洲城乡居民之间的沟通差距
- 【计算机毕业设计】基于微信小程序的美食食谱大全系统
- 献给曾经爱过和正在爱的你