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 |
附上代码,Sap的预处理分层很有可能有问题,但也不能这么诡异啊。g++也可以过In Reply To:非常诡异的一个情况 Posted by:liuyu523115237 at 2012-09-18 20:28:15 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<algorithm> #include<memory> #include<cstring> using namespace std; const int inf = 2000000000; const int maxn = 505; const int maxm = 5005; struct Edge{ int u,v,val; int next; Edge(){} Edge(int u,int v,int next,int val=0):u(u),v(v),next(next),val(val){} }edg[maxm<<1]; int tot,head[maxn]; void add(int u,int v,int flow = 0){ edg[tot] = Edge(u,v,head[u],flow); head[u] = tot++; edg[tot] = Edge(v,u,head[v]); head[v] = tot++; } int st,en,nv;//注意:如果遇到边那些都对,但是最大流是0,一般是这里忘记了 int cur[maxn],pre[maxn],dis[maxn],gap[maxn],q[maxn]; void predis() { int i,u,v,l,r=0; for(i=0; i<=nv; ++i)dis[i]=-1,gap[i]=0; gap[dis[q[r++]=en]=0]=1; for(l=0; l<r; ++l) for(i=head[u=q[l]]; i!=-1; i=edg[i].next) if(edg[i^1].val && dis[v=edg[i].v]<0) ++gap[dis[q[r++]=v]=dis[u]+1]; } int Sap( int st, int en ){ predis();//预处理分层,dis[] gap[]删了;其余不变 int u = pre[st] = st,maxflow = 0,aug = inf; for(int i=0;i<=nv;++i)cur[i]=head[i]; while( dis[st] < nv ) { loop: for( int &i = cur[u]; i != -1 ; i = edg[i].next ) {//无敌取地址符&,节约一行代码cur[u]=i; int v =edg[i].v; if( edg[i].val && dis[u] == dis[v]+1) { aug = aug < edg[i].val? aug: edg[i].val; pre[v] = u; u = v; if( v == en ) { maxflow += aug; for( u = pre[u]; v != st ; v = u,u = pre[u] ) { edg[cur[u]].val -= aug; edg[cur[u]^1].val += aug; } aug = inf; } goto loop; } } int mindis = nv; for( int i = head[u]; i != -1 ; i = edg[i].next ){//变量是i了,wa过一次 int v = edg[i].v; if( edg[i].val && dis[v] < mindis) { cur[u] = i; //注意这 mindis = dis[v]; } } if( --gap[dis[u]] == 0 ) break; gap[ dis[u] = mindis+1 ]++; //写成==会死循环 u = pre[u]; } return maxflow; } int col[maxn]; void dfs1(int u){ col[u] = 1; for(int i=head[u];i!=-1;i=edg[i].next){ int v = edg[i].v; if(edg[i].val && !col[v]) dfs1(v); } } void dfs2(int u){ col[u] = -1; for(int i=head[u];i!=-1;i=edg[i].next){ int v = edg[i].v; if(edg[i^1].val && !col[v]) dfs2(v); } } int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ memset(head,-1,sizeof(head)); tot = 0; st = 0; en = n -1; nv = n; int a,b,c; while(m--){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); } Sap(st,en); memset(col,0,sizeof(col)); dfs1(st); dfs2(en); int ans = 0; for(int i=0;i<tot;i+=2) if(!edg[i].val && col[edg[i].u]==1 && col[edg[i].v]==-1) ++ans; printf("%d\n",ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator