ZOJ 3496 Assignment | 二分+有上下界网络流
题目:
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 | 二分+有上下界网络流的更多相关文章
- [zoj] 3496 Assignment || 有源汇上下界最大流
原题 贴个博客吧 #include<cstdio> #include<algorithm> #include<cstring> #define N 510 #def ...
- 【上下界网络流 二分】bzoj2406: 矩阵
感觉考试碰到上下界网络流也还是写不来啊 Description Input 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. Output 第一行,输出 ...
- BZOJ 2406 二分+有上下界的网络流判定
思路: 求出每行的和 sum_row 每列的和 sum_line 二分最后的答案mid S->i 流量[sum_row[i]-mid,sum_row[i]+mid] i->n+j ...
- ZOJ Problem Set - 3229 Shoot the Bullet 【有上下界网络流+流量输出】
题目:problemId=3442" target="_blank">ZOJ Problem Set - 3229 Shoot the Bullet 分类:有源有汇 ...
- 【有上下界网络流】【ZOJ】2314 Reactor Cooling
[算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...
- hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )
题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)
https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...
- 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流
最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...
- POJ 2396 Budget(有源汇上下界网络流)
Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...
随机推荐
- 构建ExtJS 6.x程序
构建ExtJS 6.x程序 ExtJS也有自己的打包工具 SenchaCmd,它用来生成构建ExtJS前端组织架构,最后打包发布生产,操控着前端整个开发生命周期,SenchaCmd依赖于JDK,所以要 ...
- Windows环境下安装redis及PHP Redis扩展
附带管理工具安装教程 安装环境 WNMP环境 参考教程:WIN10下WNMP开发环境部署 安装windows的redis服务 安装包下载 选择msi安装包下载并安装,下载可能会有点慢,请自行使用梯子. ...
- python3 练习题100例 (二十二)输入两个字符串,输出两个字符串集合的并集
题目内容: 输入两个字符串,输出两个字符串集合的并集. 为保证输出结果一致,请将集合内元素排序之后再输出, 如对于集合aset,可输出sorted(aset). 输入格式: 共两行,每一行为一个字符串 ...
- sql插入查询出的数据,主键递增
INSERT INTO C_DPRECORD SELECT (SEQ_C_DPRECORD.NEXTVAL ) AS ID, DEV_ID, DEV_CHNNUM, DEV_NAME, DEV_CHN ...
- Ubantu E325 错误的解决办法
这个错误是由于未正确关闭文本编辑器导致的: 图一 解决办法:退出后输入 sudo vim /etc/hosts 图二 直接输入 D 即可! 注意:退出文本编辑器的正确方式是:ESC键 + :wq. 我 ...
- java Vector向量
9.3.4 Vector向量 [专业IT培训机构,真正零首付入学www.bjsxt.com] Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”. 比如,ind ...
- Cadence17.2下载ALTERA的FPGA封装库
1. 在Cadence的安装目录里面找了下,发现都没有Altera的FPGA型号的函数库,下面的虽然是ALTERA,但是没有FPGA的器件封装 2. 去intel的官网看能不能下载到,INTEL网址, ...
- beego orm
http://beego.me/docs/mvc/model/overview.md go get github.com/astaxie/beego/orm Simple Usage package ...
- 事务消息中心-TMC
此文已由作者杨凯明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 背景 为什么要做事务消息中心 原有kqueue的方式缺点: 降低业务库性能 占用业务库磁盘 历史数据管理成本 ...
- ibatis常用sql
(1) 输入参数为单个值 <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" p ...