题意:

     给你一个有向图,每条边上都有每一时刻的最大流量,有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. HDU4807 Lunch Time(费用流变种)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4807 Description The campus of Nanjing Universit ...

  2. ACdream 1128 Maze(费用流)

    题目链接:http://acdream.info/problem?pid=1128 Problem Description wuyiqi陷入了一个迷宫中,这个迷宫是由N*M个格子组成的矩阵.每个格子上 ...

  3. CF 321B Ciel and Duel(费用流)

    题目链接:http://codeforces.com/problemset/problem/321/B 题意:两个人,分别有n.m张牌.每张牌有两个属性类型和能力,类型为攻击或者防守.B的m张牌的属性 ...

  4. 【UVALive - 5131】Chips Challenge(上下界循环费用流)

    Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...

  5. Codeforces Gym 101190M Mole Tunnels - 费用流

    题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...

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

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

  7. BZOJ2040[2009国家集训队]拯救Protoss的故乡——模拟费用流+线段树+树链剖分

    题目描述 在星历2012年,星灵英雄Zeratul预测到他所在的Aiur行星在M天后会发生持续性暴雨灾害,尤其是他们的首都.而Zeratul作为星灵族的英雄,当然是要尽自己最大的努力帮助星灵族渡过这场 ...

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

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

  9. Bzoj2673 3961: [WF2011]Chips Challenge 费用流

    国际惯例题面:如果我们枚举放几个零件的话,第二个限制很容易解决,但是第一个怎么办?(好的,这么建图不可做)考虑我们枚举每行每列最多放几个零件t,然后计算零件总数sum.这样如果可行的话,则有t*B&l ...

随机推荐

  1. C++多文件结构和预编译命令

    下面随笔将给出C++多文件结构和预编译命令细节. 多文件结构和编译预处理命令 c++程序的一般组织结构 一个工程可以划分多个源文件 类声明文件(.h文件) 类实现文件(.cpp文件) 类的使用文件(m ...

  2. Java I/O流 01

    文件IO·异常 和 File类 异常的概述和分类 * A:异常的概述 * 异常就是Java程序在运行过程中出现的错误 * B:异常的分类 * 用过API查看Throwable * Error * 服务 ...

  3. 由于makefile编译所有子目录中 sed 's,/($*/)/.o[ :],/1.o $@ : ,g' <$@ > $@ 的解释

    这个语句分为好几层,我们一层一层来看 1. sed 's,/($*/)/.o[ :],/1.o $@ : ,g' <$@ > $@ 首先看加粗这一层,$@表示目标参数中的.d文件, '&l ...

  4. go中sync.Once源码解读

    sync.Once 前言 sync.Once的作用 实现原理 总结 sync.Once 前言 本次的代码是基于go version go1.13.15 darwin/amd64 sync.Once的作 ...

  5. 死磕Spring之IoC篇 - @Bean 等注解的实现原理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  6. 「视频小课堂」Logstash如何成为镇得住场面的数据管道(文字版)

    视频地址 B站视频地址:Logstash如何成为镇得住场面的数据管道 公众号视频地址:Logstash如何成为镇得住场面的数据管道 知乎视频地址:Logstash如何成为镇得住场面的数据管道 内容 首 ...

  7. 解析Wide Residual Networks

    Wide Residual Networks (WRNs)是2016年被提出的基于扩展通道数学习机制的卷积神经网络.对深度卷积神经网络有了解的应该知道随着网络越深性能越好,但是训练深度卷积神经网络存在 ...

  8. .NET初探源代码生成(Source Generators)

    前言 Source Generators顾名思义代码生成器,可进行创建编译时代码,也就是所谓的编译时元编程,这可让一些运行时映射的代码改为编译时,同样也加快了速度,我们可避免那种昂贵的开销,这是有价值 ...

  9. IPFS挖矿的成本有哪些?

    IPFS作为区块链新贵,近来风头一时无量.截止3月9日,Filecoin以257亿的流通市值超越门罗币,稳居区块链流通排行榜. 无论什么投资,其门槛一定在成本.今天就和大家细说投资市面上常见实体矿机的 ...

  10. [差分][二分][贪心]luogu P3634 [APIO2012]守卫

    题面 https://www.luogu.com.cn/problem/P3634 给m个限制,可以是一段区间中必须有或者必须无忍者 最多有k个忍者,问有多少个位点一定有忍者 分析 首先用差分标记一下 ...