Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
纪念一下终于过了第一条网络流。。 附一个0ms的push-relabel解法#include <cstdio> #include <cstring> #define _N 500 #define _NL 4096 using namespace std; int g[_N],h[_N],e[_N],z[_N]; int bp,bq,b[_NL]; struct node{ int y,val,p; void ini(int a, int b, int c){ y=a; val=b; p=c; } void show(){ printf("%d %d %d\n",y,val,p); } } s[3000]; int n,m; int main(){ int x,y,val,p,v,w,h_min; while (scanf("%d%d",&n,&m)>0){ p=2; //(We use 0 to mark g[]) 2^1=3, 3^1=2; In this way can we ... memset(g,0,sizeof(g)); for (int i=1;i<=n;++i){ scanf("%d%d%d",&x,&y,&val); s[p].ini(y,val,g[x]); g[x]=p; ++p; s[p].ini(x,0,g[y]); //backside g[y]=p; ++p; } memset(h,0,sizeof(h)); memset(e,0,sizeof(e)); memset(z,0,sizeof(z)); p=g[1]; while (p!=0){ e[1]+=s[p].val; p=s[p].p; } h[1]=m; // !! z[1]=1; bp=0;bq=1; b[0]=1; while (bp!=bq){ v=b[bp]; p=g[v]; h_min = _N+_N; while (e[v]>0 && p!=0){ w=s[p].y; if (h[v]>h[w]){ if (e[v]<s[p].val){ s[p].val-=e[v]; s[p^1].val+=e[v]; e[w]+=e[v]; e[v]=0; }else{ e[v]-=s[p].val; e[w]+=s[p].val; s[p^1].val+=s[p].val; s[p].val=0; } if (!z[w] && w!=1 && w!=m){ //切记不可加入源点汇点 z[w]=1; b[bq]=w; ++bq; if (bq>=_NL) bq=0; } }else{ if (h[w]<h_min) h_min = h[w]; } p=s[p].p; } if (e[v]>0 && v!=1){ //非常规做法的一个小坏处 h[v] = h_min+1; //MOST important! b[bq]=v; ++bq; if (bq>=_NL) bq=0; }else{ z[v]=0; } ++bp; if (bp>=_NL) bp=0; } printf("%d\n",e[m]); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator