SGU 212
2013-03-25 17:23
141 查看
贪心预流推进,
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int N = 2111; const int M = 711111; struct Edge { int v,next; int c; } edge[M]; int E,head ,cur ,dis ,gap ,pre ; int l ; bool vis ; int in ; void add_edge(int s,int t,int c,int cc=0) { edge[E].v=t; edge[E].c=c; edge[E].next=head[s]; head[s]=E++; edge[E].v=s; edge[E].c=cc; edge[E].next=head[t]; head[t]=E++; } inline int minx(int a,int b) { return (a==-1||b<a)?b:a; } int q ; void gready(int s,int dest) { int first=0,rear=1; q[0]=s; int i,j,u,v; int t; in[s]=0x7f7f7f7f; vis[s]=true; while(first<rear)//广搜 正向推流 { u=q[first++]; for(i=head[u]; ~i; i=edge[i].next) { if(in[u]==0) break; v=edge[i].v; if(l[v]==l[u]+1) { t=min(in[u],edge[i].c); in[u]-=t; in[v]+=t; edge[i].c-=t; edge[i^1].c+=t; } if(!vis[v]) { vis[v]=true; q[rear++]=v; } } } /* 反向拉流 for(i=rear-1;i>=0;--i) { u=q[i]; for(j=head[u];~j;j=edge[j].next) { v=edge[j].v; if(l[u]==l[v]+1&&v!=dest) { t=min(edge[j^1].c,in[v]); in[u]+=t; in[v]-=t; edge[j].c+=t; edge[j^1].c-=t; } } } */ } int sap(int s,int t,int n) { memset(gap,0,sizeof(gap)); memset(dis,0,sizeof(dis)); int i; for(i=0; i<=n; i++) cur[i]=head[i]; int u=pre[s]=s,maxflow=0,v; ll aug=-1; gap[0]=n; while(dis[s]<n) { loop: for(i=cur[u]; ~i; i=edge[i].next) { v=edge[i].v; if(edge[i].c>0&&dis[u]==dis[v]+1) { aug=minx(aug,edge[i].c); cur[u]=i; pre[v]=u; u=v; if(u==t) { for(u=pre[u]; v!=s; v=u,u=pre[u]) { edge[cur[u]].c-=aug; edge[cur[u]^1].c+=aug; } maxflow+=aug; aug=-1; } goto loop; } } int mindis=n; for(i=head[u]; ~i; i=edge[i].next) { v=edge[i].v; if(edge[i].c>0&&dis[v]<mindis) { mindis=dis[v]; cur[u]=i; } } if((--gap[dis[u]])==0) break; gap[dis[u]=mindis+1]++; u=pre[u]; } return maxflow; } int main() { E=0; int a,b,c; int i,n,m,L; memset(head,-1,sizeof(head)); scanf("%d%d%d",&n,&m,&L); int s,t; for(i=1; i<=n; ++i) { scanf("%d",l+i); if(l[i]==1) s=i; if(l[i]==L) t=i; } for(i=0; i<m; ++i) { scanf("%d%d%d",&a,&b,&c); add_edge(a,b,c); } gready(s,t); int flow=sap(s,t,n); for(i=1; i<E; i+=2) { printf("%d\n",edge[i].c); } return 0; }
相关文章推荐
- sgu-212 Data Transmission
- SGU212 Data Transmission(高标号预流推进算法)
- sgu212
- sgu 326(经典网络流构图)
- Little shop of flowers - SGU 104 dp
- SGU 145.Strange People(无环K短路)
- sgu 539 Multiswap Sorting 策略
- SGU 157.Patience
- sgu 414 Orthogonal Circles 圆的正交
- SGU 403 Game with points
- SGU 403 404 405 406 407 408 409 410 411 413
- SGU 202. The Towers of Hanoi Revisited
- SGU 164.Airline(结论题)
- SGU 205. Quantization Problem
- SGU 199 Beautiful People
- SGU 187.Twist and whirl - want to cheat
- sgu 183. Painting the balls 动态规划 难度:3
- SGU 101. Domino 欧拉回路
- 快速切题 sgu116. Index of super-prime bfs+树思想
- SGU 124. Broken line 射线法 eps的精准运用,计算几何 难度:3