HDU 6142 Jedi Council(最小割-Dinic)
来源:互联网 发布:h5页面源码下载 编辑:程序博客网 时间:2024/05/23 12:06
Description
要求给出满足上述条件的赋值使得
其中
Input
第一行一整数
Output
输出
Sample Input
1
3 1 1 1
1 2 3 1 1 1 1 1 1
1 2 2
Sample Output
3
Solution
由
最小割的另一种解释:令源点
本题类似的把
一.对于形如
二.对于形如
1.当
2.当
三.对于限制
1.当
2.当
3.当
Code
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define maxn 505 #define maxm 20005#define INF 0x3f3f3f3fint head[maxn],cur[maxn],d[maxn],st[maxm],s,e,no;//s为源点,e为汇点,n为点数,no为边数 struct point{ int u,v,flow,next; point(){}; point(int x,int y,int z,int w):u(x),v(y),next(z),flow(w){};}p[maxm];void add(int x,int y,int z)//从x到y建容量为z的边 { p[no]=point(x,y,head[x],z);//前向弧,标号为偶 head[x]=no++; p[no]=point(y,x,head[y],0);//后向弧,标号为奇 head[y]=no++;}void init()//初始化 { memset(head,-1,sizeof(head)); no=0;}bool bfs(){ int i,x,y; queue<int>q; memset(d,-1,sizeof(d)); d[s]=0; q.push(s); while(!q.empty()) { x=q.front(); q.pop(); for(i=head[x];i!=-1;i=p[i].next) { if(p[i].flow&& d[y=p[i].v]<0) { d[y]=d[x]+1; if(y==e) return true; q.push(y); } } } return false;}int dinic()//最大流 { int i,loc,top,x=s,nowflow,maxflow=0; while(bfs()) { memcpy(cur,head,sizeof(head)); top=0; while(true) { if(x==e) { nowflow=INF; for(i=0;i<top;i++) { if(nowflow>p[st[i]].flow) { nowflow=p[st[i]].flow; loc=i; } } for(i=0;i<top;i++) { p[st[i]].flow-=nowflow; p[st[i]^1].flow+=nowflow; } maxflow+=nowflow; top=loc; x=p[st[top]].u; } for(i=cur[x];i!=-1;i=p[i].next) if(p[i].flow&&d[p[i].v]==d[x]+1) break; cur[x]=i; if(i!=-1) { st[top++]=i; x=p[i].v; } else { if(!top) break; d[x]=-1; x=p[st[--top]].u; } } } return maxflow;}int T,n,W,P,Q,num[maxn]; int main(){ scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&n,&W,&P,&Q); s=0,e=n+1; init(); for(int i=1;i<=n;i++)num[i]=1; while(P--) { int x,y,z,a,b,c,d,e,f; scanf("%d%d%d%d%d%d%d%d%d",&x,&y,&z,&a,&b,&c,&d,&e,&f); add(y,x,4*a),add(z,y,4*b),add(x,z,4*c); num[x]+=(d-a)-(f-c),num[y]+=(e-b)-(d-a),num[z]+=(f-c)-(e-b); } int ans=0; for(int i=1;i<=n;i++) if(num[i]>0)ans-=num[i],add(s,i,2*num[i]); else if(num[i]<0)ans+=num[i],add(i,e,-2*num[i]); while(Q--) { int x,y,op; scanf("%d%d%d",&x,&y,&op); if(op==0)add(y,x,INF); else if(op==1)add(x,y,INF),add(y,x,INF); else add(s,x,INF),add(y,e,INF); } ans+=dinic(); printf("%I64d\n",(ll)ans*W); } return 0;}
- HDU 6142 Jedi Council(最小割-Dinic)
- [HDU 6142] Jedi Council
- HDU 1565 方格取数(1)(最小割-Dinic)
- HDU 6126 Give out candies(最小割-Dinic)
- hdu 4859 海岸线【最小割---------Dinic】
- 【dinic && 拆点 && 最小割】HDU
- POJ 3308 Paratroopers(最小割+Dinic)
- GYM101128F.Landscaping(最小割-Dinic)
- Dinic模板(最大流最小割)
- dinic最大流模板(最小割)
- HDU 3046 Pleasant sheep and big big wolf(最小割-Dinic)
- hdu 5294 Tricks Device (最小割+最短路径+Dinic模板)
- hdu 2435(最小割 --dinic模板-- 最大流)
- hdu 2435dinic算法模板+最小割性质
- hdu 2435 dinic算法模板+最小割性质
- HDU 2435 There is a war Dinic 最小割
- hdu 5889 Barricade【最短路SPFA+最小割--------Dinic】
- hdu 3452 Bonsai【最大流最小割-------Dinic】
- 浏览器内核信息汇总和
- Deep Learning模型之:CNN卷积神经网络(二)文字识别系统LeNet-5
- Java中HashMap的实现原理
- perl 调用自己写的pm
- 交换两个数的四种方法
- HDU 6142 Jedi Council(最小割-Dinic)
- 《30天自制操作系统》 day02
- 下载文件
- Linux(Red Hat)安装loadrunner负载机(精简步骤)
- django select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)
- Java多线程学习(超详细总结)
- RegExp--笔记
- ASP.NET 搜索关键字标记为红色
- 各类文件的文件头标志