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; }
相关文章推荐
- 无源汇最大流 SGU 194 Reactor Cooling
- 【无源汇点上下界最大流】[SGU194]Reactor Cooling
- 【无源汇上下界最大流】SGU 194 Reactor Cooling
- sgu 194 上下界最大流 此代码SGU瞬间过,ZOJ瞬间WA
- SGU - 194 Reactor Cooling(无源无汇有上下界最大流)
- sgu-194-Reactor Cooling(无源汇有上下界最大流)
- 【无源汇上下界最大流】SGU 194 Reactor Cooling
- sgu-194-Reactor Cooling(无源汇有上下界最大流)
- sgu 194 被动散热器具有最大流量的上限和下限(最大流量模板dinic加上优化)
- SGU 194 Reactor Cooling(无源汇有上下界最大流)
- sgu194 无源汇上下界的最大流
- SGU194 Reactor Cooling 有下界最大流
- SGU 185 Two shortest 最短路+最小费用最大流 或者 最短路+最大流
- sgu 194 Reactor Cooling
- sgu 194上下界网络流
- SGU 194 Reactor Cooling(有上下限可行流)
- sgu 185 Two shortest 最大流
- sgu194 Reactor Cooling【无源汇有上下界可行流】
- hdu4940,sgu194,无源汇上下界网络流
- 【SGU438】The Glorious Karlutka River =) 分层图最大流