题意:
     给你一个有向图,每条边上都有每一时刻的最大流量,有k个人在点0,他们要去点n-1,问你最晚到达的那个人最快要多久。

思路:
     这个题目做了很多次,用过费用流,也用过最大流,结果都不行,怎么说的,这道题目用该是借助费用流的找新路径去枚举,可以说是费用流变形吧,首先我们一定要明白一点,就是时间的影响,单纯的最大流如果在时间的基础上考虑没什么意义,而费用流呢,我们想象一下,如果把时间设成费用那么我们就可以吧流量和时间结合起来了,在费用流的过程中我们要知道,他每一次都是根据最短路去找新的路径的,也就是说路径在费用上来说是递增的(流量不一定),那么我们就可以根据这个特点来枚举一那些路径来过人,要明白,如果起点到终点有两条边,一条很近,一条很远,有可能大家都走近的路径(宁可排队走),也不走远的(所以直接最大流是错了),那么我们就可以枚举路径了,路径可以直接用费用流每次的路径,因为时间递增的,对于每一次我们能过的人是多少呢?这个地方很关键,对于每一条路径来说,如果当前的路径a距离是10,流量是15,那么当时间大于10的时候,每过一个时间单位,路径a都可以再过15个人,所以当前的时间段的总人数是
之前的总人数+(当前长度-上一个长度)* 上一个的总流量 + 当前流量
那么如果现在当前这一部之前的所有路径当路径要花费的时间是多少呢
now = 当前长度+剩余的路径长度/当前总流量  向上取整

这样比较now和ans更新答案就行了,还有一个地方要明确,就是当总人数超过全图的最大流的时候答案就是 费用流中最长的路径 + 总人数/全图最大流 向上取整,这个地方不用特判,上面的想法里面包括在这里,说了只是为了便于理解。


#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h>#define N_node 2500 + 50
#define N_edge 10000 + 100
#define INF 2000000000

using namespace std;typedef struct
{int from ,to ,next ,cost ,flow;
}STAR;STAR E[N_edge];
int list[N_node] ,tot;
int mer[N_edge] ,s_x[N_node];void add(int a ,int b ,int c ,int d)
{E[++tot].from = a;E[tot].to = b;E[tot].cost = c;E[tot].flow = d;E[tot].next = list[a];list[a] = tot;
}bool spfa(int s ,int t ,int n)
{int mark[N_node] = {0};for(int i = 0 ;i <= n ;i ++)s_x[i] = INF;queue<int>q;q.push(s);mark[s] = 1 ,s_x[s] = 0;memset(mer ,255 ,sizeof(mer));while(!q.empty()){int xin ,tou;tou = q.front();q.pop();mark[tou] = 0;for(int k = list[tou] ;k ;k = E[k].next){xin = E[k].to;if(s_x[xin] > s_x[tou] + E[k].cost && E[k].flow){ s_x[xin] = s_x[tou] + E[k].cost;mer[xin] = k;if(!mark[xin]){mark[xin] = 1;q.push(xin);}}}}return mer[t] != -1;
}int M_C_Flow(int s ,int t ,int n ,int k)
{if(!k) return 0;int minflow ,sum_peo = k ,now_peo = 0 ,list_time = 0 ,ans = INF;while(spfa(s ,t ,n)){               minflow = INF;for(int i = mer[t] ;i + 1 ;i = mer[E[i].from])if(minflow > E[i].flow) minflow = E[i].flow;for(int i = mer[t] ;i + 1 ;i = mer[E[i].from])E[i].flow -= minflow ,E[i^1].flow += minflow;sum_peo -= (s_x[t] - list_time) * now_peo + minflow;list_time = s_x[t] ,now_peo += minflow;int now = s_x[t] + (int)ceil((1.0 * (sum_peo < 0 ? 0 : sum_peo ))/now_peo);if(ans > now) ans = now;if(sum_peo < 1) break;}return ans;
}int main ()
{int n ,m ,k ,i ,a ,b ,c;while(~scanf("%d %d %d" ,&n ,&m ,&k)){memset(list ,0 ,sizeof(list));tot = 1;for(i = 1 ;i <= m ;i ++){scanf("%d %d %d" ,&a ,&b ,&c);a ++ ,b ++;add(a ,b ,1 ,c) ,add(b ,a ,-1 ,0);}int ans = M_C_Flow(1 ,n ,n ,k);ans == INF ? puts("No solution"):printf("%d\n" ,ans);}return 0;
}

hdu4807枚举费用流相关推荐

  1. AtCoder AGC031E Snuke the Phantom Thief (费用流)

    题目链接 https://atcoder.jp/contests/agc031/tasks/agc031_e 题解 做法一(我的做法) 这是我yy出来的一个上下界费用流做法,自己没找到什么反例,能过. ...

  2. BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1920 (luogu) https://www.luogu.org/prob ...

  3. 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...

  4. BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)

    BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...

  5. [UOJ455][UER #8]雪灾与外卖——堆+模拟费用流

    题目链接: [UOJ455]雪灾与外卖 题目描述:有$n$个送餐员(坐标为$x_{i}$)及$m$个餐厅(坐标为$y_{i}$,权值为$w_{i}$),每个送餐员需要前往一个餐厅,每个餐厅只能容纳$c ...

  6. HDU 4833 Best Financing 一脸费用流的dp

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=4833 题意:中文题不解释... 解题思路: 首先以interest_rates为费用建图跑费用流是比较容易 ...

  7. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

  8. upc 6445: 棋盘V (网络流费用流解决匹配问题)

    6445: 棋盘V 时间限制: 1 Sec  内存限制: 128 MB 提交: 325  解决: 31 [提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100 ...

  9. [BZOJ 1221][HNOI2001]软件开发(费用流)

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

最新文章

  1. 百度也出分享(百度分享)
  2. “人工智能”浪潮退去,“AI四小龙”怎么了?
  3. 运行第一个 Service - 每天5分钟玩转 Docker 容器技术(96)
  4. boost::hash_range相关的测试程序
  5. Linux 如何取进程运行时间,linux -- 获取进程执行时间
  6. Windows7下Docker的安装
  7. 图像拼接(二):OpenCV同时打开两个摄像头捕获视频
  8. 使用randomaccessfile类将一个文本文件中的内容逆序输出_Java 中比较常用的知识点:I/O 总结...
  9. Java LocalDateTime类| 带示例的compareTo()方法
  10. 有三角形的即时通讯源码?
  11. 【机器学习】基于AutoEncoder的BP神经网络的tensorflow实现
  12. 操作文件读写JSON的建议工具类
  13. 花生壳:域名诊断—客户端离线
  14. GitHub上java的开源项目(java程序员必备)
  15. 腾讯 信鸽测试demo
  16. 哈希函数 英语单词_使用Hash表实现英文单词表并实现单词查询操作
  17. 【Arduino】继电器控制水泵抽水
  18. EBS 个性化:个性化设置界面
  19. delphi调试需要管理员权限程序报错“Unable to create process:请求的操作需要提升”
  20. BurpSuite专业版下载安装教程

热门文章

  1. 【No.3 Ionic】超级逗表情 App
  2. Hadoop集群安装-CDH5(5台服务器集群)
  3. 后盾网lavarel视频项目---5、淘宝镜像cnpm的原理及如何使用
  4. docker部署xxl-job 通用反射执行器
  5. Hdoj 1846.Brave Game 题解
  6. 【sping揭秘】9、容器内部事件发布(二)
  7. 茶香账簿小程序开发进度(1)
  8. Shell脚本笔记(三)shell中的数学计算
  9. hadoop大数据分析与挖掘实战(读书笔记3)
  10. Vitamio打造自己的Android万能播放器