hdu 4289 Control (成都网络赛最小割)
来源:互联网 发布:金蝶软件下载中心 编辑:程序博客网 时间:2024/09/21 06:17
题目: http://acm.hdu.edu.cn/showproblem.php?pid=4289
分析:题目给定的是每个节点的权值,所以要进行拆点操作,即在a和a+n之间连边,流量为点权。然后对于原来的边的情况,建立四条边(无向),(a+n,b)和(b+n,a),流量为无穷,以及它们各自的反向边(b,a+n)和(a,b+n),流量为0,最后把汇点改为输入值+n。
代码:
#include <stdio.h>#include <string.h>#define N 10010#define M 400010const int inf = 0x3f3f3f3f;struct E{ int to, frm, nxt, cap;}edge[M];int head[N],e,n,m,src,des;int dep[N], gap[N];void addedge(int u, int v, int w){ edge[e].frm = u; edge[e].to = v; edge[e].cap = w; edge[e].nxt = head[u]; head[u] = e++; edge[e].frm = v; edge[e].to = u; edge[e].cap = 0; edge[e].nxt = head[v]; head[v] = e++;}int que[N];void BFS(){ memset(dep, -1, sizeof(dep)); memset(gap, 0, sizeof(gap)); gap[0] = 1; int front = 0, rear = 0; dep[des] = 0; que[rear++] = des; int u, v; while (front != rear) { u = que[front++]; front = front%N; for (int i=head[u]; i!=-1; i=edge[i].nxt) { v = edge[i].to; if (edge[i].cap != 0 || dep[v] != -1) continue; que[rear++] = v; rear = rear % N; ++gap[dep[v] = dep[u] + 1]; } }}int cur[N],stack[N];int Sap() { int res = 0; BFS(); int top = 0; memcpy(cur, head, sizeof(head)); int u = src, i; while (dep[src] < n*2) { if (u == des) { int temp = inf, inser = n; for (i=0; i!=top; ++i) if (temp > edge[stack[i]].cap) { temp = edge[stack[i]].cap; inser = i; } for (i=0; i!=top; ++i) { edge[stack[i]].cap -= temp; edge[stack[i]^1].cap += temp; } res += temp; top = inser; u = edge[stack[top]].frm; } if (u != des && gap[dep[u] -1] == 0) break; for (i = cur[u]; i != -1; i = edge[i].nxt) if (edge[i].cap != 0 && dep[u] == dep[edge[i].to] + 1) break; if (i != -1) { cur[u] = i; stack[top++] = i; u = edge[i].to; } else { int min = n*2; for (i = head[u]; i != -1; i = edge[i].nxt) { if (edge[i].cap == 0) continue; if (min > dep[edge[i].to]) { min = dep[edge[i].to]; cur[u] = i; } } --gap[dep[u]]; ++gap[dep[u] = min + 1]; if (u != src) u = edge[stack[--top]].frm; } } return res;}int main(){ int i,c,x,y;while(scanf("%d%d",&n,&m)!=EOF){ e=0;memset(head,-1,sizeof(head)); scanf("%d%d",&src,&des);des+=n; for(i=1;i<=n;i++){ scanf("%d",&c); addedge(i,i+n,c);}for(i=1;i<=m;i++){ scanf("%d%d",&x,&y); addedge(x+n,y,inf); addedge(y+n,x,inf);}printf("%d\n",Sap());}return 0;}
- hdu 4289 Control (成都网络赛最小割)
- 【最小割】HDU 4289 Control
- hdu 4289 Control (最小割)
- hdu 4289 Control 网络流,最小割,拆点
- HDU 4289 Control (网络流-最小割)
- HDU 4289 Control(最小割)
- hdu 4289 Control(图论-最小割)
- HDU 4289 Control(最小割)
- hdu 4289 Control 最小割 isap
- hdu 4289 Control (最小割 sap)
- HDU - 4289 Control (最小割 MCMF)
- hdu 4289 Control【最小割+拆点】
- HDU 4289--Control【最小割 && 拆点】
- 最大流最小割-HDU-4289-Control
- HDU 4289 Control (最小割 拆点)
- HDU 4289 Control(最大流、最小割)
- HDU 4289 Control 最小割最大流 拆点
- HDU 4289 Control (最大流最小割)
- ORACLE 中EXP命令
- iOS 线程退出
- Oracle数据分摊问题解析
- 最小费用最大流
- 动态代理 和 装饰模式的 一些思考
- hdu 4289 Control (成都网络赛最小割)
- BBC私房药药方收集
- 为什么这么多半导体公司都重视大学计划?
- VF修改DBF--菜鸟详情经历
- IE6、 IE7、IE8、IE9、Firefox兼容性问题
- hdu 1251 1671字典树
- Linux的脚本自动交互
- Linux 一条命令删除某端口被占用的进程
- 12306网站和电话订火车票操作技巧