BZOJ 1834 ZJOI2010 network 网络扩容 Dinic+EK费用流

来源:互联网 发布:java8 并发编程实战 编辑:程序博客网 时间:2024/05/09 12:22

题目大意:给定一个n个点m条边的无向图,每条边有一个扩容费用c,代表每扩容1流量的花费,求最大流及将最大流扩大k的最小费用

第一问直接跑最大流

第二问将每条边的起始点向终点连接一条流量为正无穷、费用为c的边 然后将n向汇点连一条流量为ans+k 费用为0的边 跑最小费用最大流即可

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define M 5010#define INF 0x3f3f3f3f#define S 1#define T (n+1)using namespace std;struct edge{int x,y,f,c;}edges[M];struct abcd{int to,f,c,next;}table[M<<2];int head[M],tot=1;int n,m,k,ans,anscost;int dpt[M];void Add(int x,int y,int f,int c){table[++tot].to=y;table[tot].f=f;table[tot].c=c;table[tot].next=head[x];head[x]=tot;}bool BFS(){static int q[M],r,h;int i;memset(dpt,-1,sizeof dpt);r=h=0;q[++r]=S;dpt[S]=1;while(r!=h){int x=q[++h];for(i=head[x];i;i=table[i].next)if(table[i].f&&!~dpt[table[i].to]){dpt[table[i].to]=dpt[x]+1;q[++r]=table[i].to;if(table[i].to==T)return true;}}return false;}int Dinic(int x,int flow){int i,left=flow;if(x==T) return flow;for(i=head[x];i&&left;i=table[i].next)if(table[i].f&&dpt[table[i].to]==dpt[x]+1){int temp=Dinic(table[i].to,min(left,table[i].f) );if(!temp) dpt[table[i].to]=-1;left-=temp;table[i].f-=temp;table[i^1].f+=temp;}return flow-left;}bool EK(){static int q[65540],flow[M],cost[M],from[M];static bool v[M];static unsigned short r,h;int i;memset(cost,0x3f,sizeof cost);cost[S]=0;flow[S]=INF;q[++r]=S;while(r!=h){int x=q[++h];v[x]=0;for(i=head[x];i;i=table[i].next)if(table[i].f)if(cost[table[i].to]>cost[x]+table[i].c){cost[table[i].to]=cost[x]+table[i].c;flow[table[i].to]=min(flow[x],table[i].f);from[table[i].to]=i;if(!v[table[i].to])v[table[i].to]=1,q[++r]=table[i].to;}}if(cost[T]==INF) return false;anscost+=flow[T]*cost[T];for(i=from[T];i;i=from[table[i^1].to])table[i].f-=flow[T],table[i^1].f+=flow[T];return true;}int main(){int i;cin>>n>>m>>k;for(i=1;i<=m;i++){scanf("%d%d",&edges[i].x,&edges[i].y);scanf("%d%d",&edges[i].f,&edges[i].c);Add(edges[i].x,edges[i].y,edges[i].f,0);Add(edges[i].y,edges[i].x,0,0);}Add(n,T,INF,0);Add(T,n,0,0);while( BFS() )ans+=Dinic(S,INF);table[tot-1].f=k;for(i=1;i<=m;i++){Add(edges[i].x,edges[i].y,INF,edges[i].c);Add(edges[i].y,edges[i].x,0,-edges[i].c);}while( EK() );cout<<ans<<' '<<anscost<<endl;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 十个小时的高铁怎么办 华为开机需要激活码怎么办 高铁提前上车了出站怎么办 买火车票忘记带身份证怎么办 买高铁票没赶上怎么办 电脑放视频没有声音怎么办 内业计算中角度超限怎么办 遇到飞机出故障乘客怎么办 模拟城市5矿产满了怎么办 模拟城市5劳工短缺怎么办 模拟城市5土地价值低怎么办 考上研究生想二战研究生学籍怎么办 小米3屏幕花屏怎么办 狗被城管抓了怎么办 隔壁家的狗扰民怎么办 遛狗碰到碰瓷老太太怎么办 碰到保安碰瓷的人怎么办 碰到碰瓷的车怎么办 商品房楼上邻居违规装修怎么办 遇到不讲道理的邻居怎么办 邻居告我我该怎么办 丈夫判刑十年回来妻子怎么办 有人发色情信息给妻子怎么办 小孩拉蛋花样便怎么办 鸡下的蛋壳是软怎么办 幼升小错过了现场审核怎么办 老人户口迁移到北京医保怎么办 过山洞经常堵耳朵怎么办 门有了一个洞该怎么办 公司要求补税没钱补怎么办 公司补税补不起了怎么办 脚被石头砸肿了怎么办 砸到脚背肿了怎么办 小猫吃完饭抓地怎么办 耳机链接处断了怎么办 表链从表盘断了怎么办 龟头和皮分开了怎么办 微信买票被骗了怎么办 撞车了我的全责怎么办 蒙田包包里面不耐脏怎么办? 摩托车转向灯不会打怎么办