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 }

Lunch Time

时间: 2024-10-06 23:13:11

Lunch Time的相关文章

The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software

The Free Lunch Is Over A Fundamental Turn Toward Concurrency in Software By Herb Sutter The biggest sea change in software development since the OO revolution is knocking at the door, and its name is Concurrency. This article appeared in Dr. Dobb's J

【转载】Free Lunch is Over(免费午餐已经结束了)

原文:Free Lunch is Over(免费午餐已经结束了) 微软C++大师Herb Sutter的文章<The Free Lunch Is Over>翻译,以前自己也经常翻译,但是都不会上传博客.个人很喜欢这篇文章,所以以此作为翻译生涯的开始. 免费的午餐结束了 软件并行计算的基本转折点 继OO之后软件发展的又一重大变革——并行计算 你的免费午餐即将即将结束.我们能做什么?我们又将做什么? 主要的处理器设计生产商,从Intel和AMD到SPARC和PowerPC,已经几乎穷尽了所有的传统

hihoCoder_#1092 Have Lunch Together(最短路)

#1092 : Have Lunch Together 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Everyday Littile Hi and Little Ho meet in the school cafeteria to have lunch together. The cafeteria is often so crowded that two adjacent seats are hard to find. School cafeteria can

hdu 4807 Lunch Time

转载自 http://blog.csdn.net/qq564690377/article/details/17100011 题意:在一个有向图当中,现在每一条边带有一个容量,现在有K个人在起点,需要到终点去吃饭,询问这K个人最后一个人到达食堂的最小时间是多少. 想法:联想到普通的网络流,那么我们网络流可以很轻松的求出两个点之间的最大容量是多少,但是现在的问题就是刚开始在起步的时候那么最开始的容量是不可能到达最大的,因为人还在途中,假设我们从时间角度来分析这个问题,再联想到我们网络流求法,费用流当

Android编译详解之lunch命令 【转】

本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析 Android的优势就在于其开源,手机和平板生产商可以根据自己的硬件进行个性定制自己的手机产品,如小米,LePhone,M9等,因此,在我们在对Android的源码进行定制的时候,很有必要了解下,Android的编译过程. 如果你从来没有做过Android代码的编译,那么最官方的编译过程就是查看Android的官方网站:http://source

Android集成一个新产品时,lunch的product name和device name注意事项

Android系统lunch一个当前的Product大概流程包括下面几个部分: 1. lunch确定TARGET_PRODUCT.一般位于vendor/device/build/target/product中的vendorsetup.sh脚本来定义分别有user/eng/userdebug. 2. 开发check product的合理性. 通过载入vendor/device/build/target/product中的AndroidProduct.mk文件,记录其包括的各个.mk文件以及其所在的

Codeforces Gym 100637B B. Lunch 找规律

B. Lunch Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100637/problem/B Description The swamp looks like a narrow lane with length n covered by floating leaves sized 1, numbered from 1 to n with a fly sitting on the top of ea

【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP

[BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的.另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的. THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排

hiho1092_have lunch together

题目 两个人从同一个点出发,在一个餐厅中寻找两个相邻的座位,需要是的从出发点到达座位的距离总和最短.题目链接: Have Lunch Together     最短路程,一开始以为要用dijkstra等图算法,发现完全不用,直接用BFS进行搜索,并标记到达每个点的最短距离.一次BFS求出从起始点 到达所有点的最短距离之后,再遍历每个点,判断该点是否是合法的座位(能够从起始点到达,且为座位),然后对每个座位,看它四周的点是否是合法的座位,然 后求出两个合法的座位的最短距离和的最小值. 实现 #in

水题 ZOJ 3875 Lunch Time

题目传送门 1 /* 2 水题:找排序找中间的价格,若有两个,选价格大的: 3 写的是有点搓:) 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cmath> 9 #include <cstring> 10 #include <string> 11 #include <map> 12 #include <