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 |
悲剧#include <iostream> #include <stdio.h> #include <string.h> #include <fstream> #include <queue> #define maxn 5000 #define maxe 200000 #define inf 0x7fffffff using namespace std; int n,m,ecnt,box[maxn+10]; struct node { int to,next,w,cap; }edge[maxe+10]; void make(int a,int b,int w,int cap) { edge[ecnt].to=b; edge[ecnt].w=w; edge[ecnt].cap=cap; edge[ecnt].next=box[a]; box[a]=ecnt++; } void make_map(int a,int b,int w) { make(a,b,w,w); make(b,a,0,w); } int level[maxn+10],p[maxn+10]; bool makelevel(int s,int t) { queue<int> q; int i; memset(level,-1,sizeof(level)); level[s]=0; q.push(s); bool flag=false; while(!q.empty()) { int tmp=q.front();q.pop(); for(i=box[tmp];i+1;i=edge[i].next) { if(edge[i].w&&level[edge[i].to]==-1) { level[edge[i].to]=level[tmp]+1; q.push(edge[i].to); if(edge[i].to==t) { flag=true; break; } } } if(flag)break; } for(i=s;i<=t;i++)p[i]=box[i]; return flag; } int dinic(int s,int t,int maxc) { if(s==t)return maxc; int ret=0,flow; for(int i=p[s];i+1;i=edge[i].next) { p[s]=i; if(edge[i].w&&level[edge[i].to]>=level[s]+1) { flow=dinic(edge[i].to,t,min(maxc-ret,edge[i].w)); edge[i].w-=flow; edge[i^1].w=flow; if((ret+=flow)==maxc)return ret; } } return ret; } int color[maxn+10]; void dfs1(int x) { int i; color[x]=1; for(i=box[x];i+1;i=edge[i].next) { if(i%2==0&&edge[i].w&&!color[edge[i].to]) { dfs1(edge[i].to); } } return; } void dfs2(int x) { int i; color[x]=2; for(i=box[x];i+1;i=edge[i].next) { if(i%2&&edge[i].w!=edge[i].cap&&!color[edge[i].to]) { dfs2(edge[i].to); } } return; } int min_flow(int s,int t) { int ans=0,cnt=0; while(makelevel(s,t)) { ans+=dinic(s,t,inf); } memset(color,0,sizeof(color)); dfs1(s); dfs2(t); int i,j; for(i=s;i<=t;i++) { for(j=box[i];j+1;j=edge[j].next) { if(j%2==0&&color[i]==1&&color[edge[j].to]==2)//因为少了j%2==0这句话 我wa了20次 { cnt++; } } } return cnt; } int main() { // freopen("in.txt","r",stdin); int i,a,b,c; while(scanf("%d%d",&n,&m)!=EOF) { ecnt=0; memset(box,-1,sizeof(box)); for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); make_map(a,b,c); } printf("%d\n",min_flow(0,n-1)); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator