hdu 3061 最大流最小割
2012-08-06 12:04
302 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3061 中文题
最小割,增加源和汇,把源与权为正的点连上界为该点权值的边,权为负的点与汇连上上界为该点权值相反数的边,然后如果攻占a必须先占b,则连上权值无穷的边a->b,所有正值之和减去最大流,即答案。。。
代码:
最小割,增加源和汇,把源与权为正的点连上界为该点权值的边,权为负的点与汇连上上界为该点权值相反数的边,然后如果攻占a必须先占b,则连上权值无穷的边a->b,所有正值之和减去最大流,即答案。。。
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<memory.h> using namespace std; const int M=502; const int MAXN=500000; const int INF=0x3f3ff3f; int t,n,m,tot; int gap[M],dis[M],pre[M],head[M],cur[M]; int NE,NV,sink,s[M],e[M],tol[M*2]; struct Node { int c,pos,next; } E[MAXN]; #define FF(i,NV) for(int i=0;i<NV;i++) int sap(int s,int t) { memset(dis,0,sizeof(int)*(NV+1)); memset(gap,0,sizeof(int)*(NV+1)); FF(i,NV) cur[i] = head[i]; int u = pre[s] = s,maxflow = 0,aug =INF; gap[0] = NV; while(dis[s] < NV) { loop: for(int &i = cur[u]; i != -1; i = E[i].next) { int v = E[i].pos; if(E[i].c && dis[u] == dis[v] + 1) { aug=min(aug,E[i].c); pre[v] = u; u = v; if(v == t) { maxflow += aug; for(u = pre[u]; v != s; v = u,u = pre[u]) { E[cur[u]].c -= aug; E[cur[u]^1].c += aug; } aug =INF; } goto loop; } } if( (--gap[dis[u]]) == 0) break; int mindis = NV; for(int i = head[u]; i != -1 ; i = E[i].next) { int v = E[i].pos; if(E[i].c && mindis > dis[v]) { cur[u] = i; mindis = dis[v]; } } gap[ dis[u] = mindis+1 ] ++; u = pre[u]; } return maxflow; } void addEdge(int u,int v,int c ) { E[NE].c = c; E[NE].pos = v; E[NE].next = head[u]; head[u] = NE++; E[NE].c = 0; E[NE].pos = u; E[NE].next = head[v]; head[v] = NE++; } int main() { int n, m; int sum, source, sink, vn,a,b; while(scanf("%d %d", &n, &m)!=EOF) { NE=0,tot=0; sum = 0; source = 0; sink=n+1; NV=sink+1; memset(head, -1, sizeof(head)); for(int i=1;i<=n;i++) { scanf("%d",&vn); if(vn>0) { addEdge(i,sink,vn); sum+=vn; } else addEdge(source,i,-vn); } for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); addEdge(b,a,INF); } printf("%d\n",sum-sap(source,sink)); } return 0; }
相关文章推荐
- HDU 3061 Battle(最小割----最大权闭合图)
- hdu 3061 Battle【最大权闭包------最小割最大流Dinic】
- HDU 3061 Battle(最小割 之 最大权闭包)经典
- hdu 1150 Machine Schedule 最小顶点覆盖(最大匹配)
- HDU 3374 String Problem (KMP+最大最小表示)
- hdu 3046 Pleasant sheep and big big wolf【最大流Dinic--------最小割】
- hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
- hdu 3061Battle(最大流最小割的应用)
- 独立最小【网络流第五弹】最大点权独立集 ——HDU 1569 方格取数(2)
- hdu 1150 最小覆盖点==最大二分匹配 Machine Schedule
- hdu 4968 最大最小gpa
- HDU 3374 String Problem(最小最大表示法+KMP)
- hdu 6118 度度熊的交易计划 (最小费用最大流
- HDU 2236 矩阵不同行列寻找 最小最大数的差值 最小 二分匹配+二分枚举区间
- hdu 3251 Being a Hero(最小割,最大权闭包+输出割边)
- HDU 5772 (最大权闭合图 最小割)
- HDU 3879 Base Station(最小割的最大权闭包 最大获利)经典
- KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home
- HDU 4081 Qin Shi Huang's National Road System(最小生成树,记录圈中最大边后暴力枚举)
- hdu 2152 Fruit 母函数之取的个数有最大最小要求