题目:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3496

大概意思:给你一个网络,有源汇,在保证最大流的情况下求下面两个问题答案

1.所有边中流量最大的边流量最小

2.所有边中流量最小的边流量最大


题解:

De了一下午啊啊,之前学的上下界网络流有问题!

对于问题一,我们二分最大流量,每次建图跑最大流,看是不是和之前一样即可

对于问题二,我们同样二分答案lim,这样每条边满足流量限制w[i]∈[lim,c[i]]

这样建图跑有源汇最大流即可.

下面是坑点

之前写的有源汇最大流都是先跑可行流然后把超级源和超级汇删掉再跑,答案还得加加减减,但是就是Wa

后来发现其实并没有那么难,在可行流的残余网络直接再跑一边最大流就是答案

感性证明如下:

因为如果可行的话超级源的所有出边都满流,这样算最大流的时候只会算到t->s的反边上,又因为原来的可行流就在这条边上,这样直接就能算出答案

别忘了输出答案*p

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
typedef long long ll;
#define N 505
#define M 400005
#define INF 0x3f3f3f3f
using namespace std;
ll Case,n,m,t,s,P,ans1,ans2,S,T,ecnt,Maxflow,l,r,u[M],v[M],c[M],mid,Maxc,lim;
ll head[N],lev[N],cur[N],du[N];
queue <ll> q;
struct adj
{
ll nxt,v,w;
} e[M];
ll read()
{
ll ret=,neg=;
char j=getchar();
for (; j>'' || j<''; j=getchar())
if (j=='-') neg=-;
for (; j>='' && j<=''; j=getchar())
ret=ret*+j-'';
return ret*neg;
}
void add(ll u,ll v,ll w)
{
e[++ecnt].v=v;e[ecnt].w=w;e[ecnt].nxt=head[u];head[u]=ecnt;
e[++ecnt].v=u;e[ecnt].w=;e[ecnt].nxt=head[v];head[v]=ecnt;
}
void init()
{
ecnt=;
memset(head,,sizeof(head));
}
bool Bfs()
{
while (!q.empty()) q.pop();
for (ll i=; i<=lim; i++)
cur[i]=head[i],lev[i]=-;
q.push(S),lev[S]=;
while (!q.empty())
{
ll u=q.front();
q.pop();
for (ll i=head[u],v; i; i=e[i].nxt)
if (lev[v=e[i].v]==- && e[i].w>)
{
q.push(v),lev[v]=lev[u]+;
if (v==T) return ;
}
}
return ;
}
ll Dfs(ll u,ll flow)
{
if (u==T) return flow;
ll ret=,delta;
for (ll &i=cur[u],v; i; i=e[i].nxt)
if (e[i].w> && lev[v=e[i].v]==lev[u]+)
{
delta=Dfs(v,min(e[i].w,flow-ret));
if (delta)
{
e[i].w-=delta;
e[i^].w+=delta;
ret+=delta;
if (ret==flow) break;
}
}
return ret;
}
ll getG(ll lim)
{
ll sum=,tmp=;
init();
add(t,s,INF);S=n+,T=n+;
memset(du,,sizeof(du));
for (ll i=; i<=m; i++)
if (c[i]-lim<) return -;
else add(u[i],v[i],c[i]-lim),du[u[i]]-=lim,du[v[i]]+=lim;
for (ll i=; i<=n; i++)
{
if (du[i]>) add(S,i,du[i]),sum+=du[i];
if (du[i]<) add(i,T,-du[i]);
}
while (Bfs()) tmp+=Dfs(S,INF);
if (tmp!=sum) return -;
tmp=;S=s;T=t;
while (Bfs()) tmp+=Dfs(S,INF);
return tmp;
}
int main()
{
Case=read();
while (Case--)
{
n=read(),m=read(),s=read(),t=read(),P=read();
init();
S=++s;T=++t;
Maxflow=Maxc=l=;
lim=n+;
for (ll i=; i<=m; i++)
u[i]=read(),v[i]=read(),c[i]=read(),add(++u[i],++v[i],c[i]),r=Maxc=max(Maxc,c[i]);
while (Bfs()) Maxflow+=Dfs(S,INF);
while (l<r)
{
init();
ll mid=l+r>>,tmp=;
for (ll i=; i<=m; i++) add(u[i],v[i],min(c[i],mid));
while (Bfs()) tmp+=Dfs(S,INF);
if (tmp==Maxflow) r=mid;
else l=mid+;
}
ans1=l;l=;r=Maxc;
while (l<r)
{
ll mid=l+r+>>,tmp=;
if (getG(mid)==Maxflow) l=mid;
else r=mid-;
}
ans2=l;
printf("%lld %lld\n",1ll*ans1*P,1ll*ans2*P);
}
return ;
}

ZOJ 3496 Assignment | 二分+有上下界网络流的更多相关文章

  1. [zoj] 3496 Assignment || 有源汇上下界最大流

    原题 贴个博客吧 #include<cstdio> #include<algorithm> #include<cstring> #define N 510 #def ...

  2. 【上下界网络流 二分】bzoj2406: 矩阵

    感觉考试碰到上下界网络流也还是写不来啊 Description Input 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. Output 第一行,输出 ...

  3. BZOJ 2406 二分+有上下界的网络流判定

    思路: 求出每行的和  sum_row 每列的和   sum_line 二分最后的答案mid S->i  流量[sum_row[i]-mid,sum_row[i]+mid] i->n+j ...

  4. ZOJ Problem Set - 3229 Shoot the Bullet 【有上下界网络流+流量输出】

    题目:problemId=3442" target="_blank">ZOJ Problem Set - 3229 Shoot the Bullet 分类:有源有汇 ...

  5. 【有上下界网络流】【ZOJ】2314 Reactor Cooling

    [算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...

  6. hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

    题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...

  7. ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)

    https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...

  8. 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流

    最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...

  9. POJ 2396 Budget(有源汇上下界网络流)

    Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...

随机推荐

  1. Mina 组件介绍之 IoBuffer

    在Java NIO 中,ByteBuffer通常作为通信中传递消息的载体.而在Mina中,采用了IoBuffer代替ByteBuffer.Mina给出了不用ByteBuffer的两个主要理由: 1.  ...

  2. 为什么不早点使用 Git...

    教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013739628770 ...

  3. 【Hbase一】基础

    此笔记仅用于作者记录复习使用,如有错误地方欢迎留言指正,作者感激不尽,如有转载请指明出处 Hbase基础 Hbase基础 Hbase定义 行存储 v s 列存储 Hbase数据模型 Hbase物理模型 ...

  4. 阿里云异常网络连接-可疑WebShell通信行为的分析解决办法

    2018年10月27日接到新客户网站服务器被上传了webshell脚本木马后门问题的求助,对此我们sine安全公司针对此阿里云提示的安全问题进行了详细分析,ECS服务器被阿里云提示异常网络连接-可疑W ...

  5. HyperLedger Fabric 1.4 区块链应用场景(3.1)

    比特币是区块链应用最早的场景,随着比特币安全稳定运行多年以后,数字货币的场景应用遍地开花,各种山寨币泛滥,通过ICO(Initial Coin Offering 首次币发行)就能融到大量资金,上市后的 ...

  6. SLAM中的常识与经验

    双目矫正 双目通常事先是通过畸变矫正标定的,而RGB-D和单目则并不一定完成了矫正. 因此,对于RGB-D和单目获取的图像,在提取特征点之后,需要矫正,而双目则可以省略这一过程. 词袋模型反向索引 D ...

  7. 【JDK配置原创】JDK(JRE)环境变量配置原理 --费元星

    已经配置了很多次jdk了,每次都是安装网上的教程配的,今天突然想了解了解原理了,整理一下! 参考贴( http://blog.csdn.net/wkupaochuan/article/details/ ...

  8. Linux-Shell脚本编程-学习-7-总结前面开启后面的学习

    国庆前期后国庆回来也都比较忙,把书一放下,在那起来,就难了,发现好多都开始忘记了,今天好不容易硬着头片看来两章,算是马马虎虎的把前面的基础性质的只是看完了吧. 后面讲开始学习Shell编程的高级阶段, ...

  9. QC的使用学习(一)

    今天学习的时间很少,就利用睡前的一点时间来学习一下刚安装好的QC. 1.后台站点管理.主要是对八大选项的了解: site project:顾名思义,就站点项目管理,管理域和项目. site user: ...

  10. SPRITEKIT游戏框架之关于PHYSICS物理引擎属性

    Spritekit提供了一个默认的物理模拟系统,用来模拟真实物理世界,可以使得编程者将注意力从力学碰撞和重力模拟的计算中解放出来,通过简单地代码来实现物理碰撞的模拟,而将注意力集中在更需要花费精力的地 ...