您的位置:首页 > 其它

SGU 194 无源汇最大流

2014-08-13 13:01 281 查看
参考 http://blog.csdn.net/hlyfalsy/article/details/38535005

类似建图..

//tpl
//ipqhjjybj_tpl.h
//header.h
#include <cstdio>
#include <cstdlib>
#include <map>
#include <set>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <sstream>
#include <math.h>

#define mp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define pLL pair<long long ,long long>
#define pb(x) push_back(x)
#define rep(i,j,k) for(int i = j; i < k;i++)

#define MAX(x,a)  x=((x)<(a))?(a):(x);
#define MIN(x,a)  x=((x)>(a))?(a):(x);

using namespace std;

const int N = 500;
int n,m,tot;
int s,t;
int sum;
struct node{
int u,v,w,next;
int kk;
node(){}
node(int _u,int _v,int _w,int _next){
u=_u,v=_v,w=_w,next=_next;
}
}edge[N*N];
int head
,cur
,dis
;
int pre
,gap
,aug
;
const int oo=0x3f3f3f;
void addEdge(int u,int v,int w,int _kk){
edge[tot]=node(u,v,w,head[u]);
edge[tot].kk = _kk;
head[u]=tot++;
edge[tot]=node(v,u,0,head[v]);
head[v]=tot++;
}

int SAP(int s,int e,int n){
int max_flow=0,v,u=s;
int id,mindis;
aug[s]=oo;
pre[s]=-1;
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
gap[0]=n;

for(int i=0;i <= n;i++)
cur[i]=head[i];

while(dis[s]<n){
if(u==e){
max_flow += aug[e];
for(v=pre[e]; v!=-1; v=pre[v]){
int ed=cur[v];
edge[ed].w -= aug[e];
edge[ed^1].w += aug[e];
aug[v]-=aug[e];
if(edge[ed].w==0) u=v;
}
}
bool flag=false;
for(id=cur[u]; id!=-1;id=edge[id].next){
v=edge[id].v;
if(edge[id].w > 0 && dis[u]==dis[v]+1){
flag=true;
pre[v]=u;
cur[u]=id;
aug[v]=min(aug[u],edge[id].w);
u=v;
break;
}
}
if(flag==false){
if(--gap[dis[u]] == 0) break;
int mindis=n;
for(id=head[u]; id!=-1; id=edge[id].next){
v=edge[id].v;
if(edge[id].w>0 && dis[v] < mindis){
mindis = dis[v];
cur[u]=id;
}
}
dis[u] = mindis + 1;
gap[dis[u]]++;
if(u!=s)u=pre[u];
}
}
return max_flow;
}
int fs = 0;
void print(){
for(int i = 1; i < fs;i += 2){
printf("%d\n",edge[i].w + edge[i-1].kk);
}
}
int in
;
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
memset(head,-1,sizeof(head));
memset(in,0,sizeof(in));
tot = s = sum = 0;
t = n+1;
int maxFlow = 0;
rep(i,0,m){
int u,v,b,d;
scanf("%d %d %d %d",&u,&v,&b,&d);
// printf("u=%d v=%d b=%d d=%d\n",u,v,b,d);
addEdge(u,v,d-b,b);
in[v]+=b;
in[u]-=b;
}

fs = tot;
// printf("fs=%d\n",fs);
rep(i,1,n+1){
if(in[i] > 0){
maxFlow += in[i];
addEdge(s,i,in[i],0);
}else{
addEdge(i,t,-in[i],0);
}
}
int kk = SAP(s,t,t+1);
// printf("kk=%d\n",kk);
if( kk == maxFlow){
puts("YES");
print();
}else{
puts("NO");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM SGU 最大流