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<cstdio> using namespace std; const __int64 oo=0x6FFFFFFF; struct NODE{ int st,ed,f; NODE *op,*next; NODE(){op=next=NULL;} }; const __int64 maxn=5005; class Maxflow { public : NODE *g[maxn],*now[maxn],*pre[maxn]; typedef int Arr1[maxn]; int m,n; int ST,ED; int flag; Arr1 dis; Arr1 back; Arr1 sumd; Maxflow(){for( int i=0 ;i<maxn ;i++ ) dis[i]=back[i]=sumd[i]=0;} void add(int st,int ed,int f) { NODE *x,*y; x=new NODE; y=new NODE; x->op=y; y->op=x; x->st=st,x->ed=ed,x->f=f,x->next=g[st],g[st]=x; y->st=ed,y->ed=st,y->f=0,y->next=g[ed],g[ed]=y; } void InitG(){for( int i=1 ;i<=n ;i++ ) g[i]=NULL;} void InitNow(){for( int i=1 ;i<=n ;i++ ) now[i]=g[i];} __int64 SAP() { int i,j,k; __int64 ans=0; int flow=oo; for( sumd[0]=n,i=ST ;dis[ST]<n ; ) { flag=false; back[i]=flow; for( NODE *t=now[i] ;t!=NULL ;t=t->next ) { j=t->ed; if( t->f<=0 || dis[i]!=dis[j]+1 ) continue; flag=true; now[i]=t; pre[j]=t; flow>t->f?flow=t->f:flow=flow; i=j; if( i==ED ) { ans+=flow; while( i!=ST ) { pre[i]->f-=flow; pre[i]->op->f+=flow; i=pre[i]->st; } flow=oo; } break; } if( flag ) continue; int Min=n-1; for( NODE *t=g[i] ;t!=NULL ;t=t->next ) if( t->f>0 && dis[t->ed]<Min ) { now[i]=t; Min=dis[t->ed]; } if( !(--sumd[dis[i]]) ) break; sumd[dis[i]=Min+1]++; if( i!=ST ) i=pre[i]->st,flow=back[i]; } return ans; } }; Maxflow profit; __int64 n,m; __int64 sum=0; __int64 tot=0; bool vis[5005]={0}; void init(){ int i,j,k; scanf("%d%d",&n,&m); profit.ST=n+1; profit.ED=profit.n=n+2; for( i=1 ;i<=n ;i++ ) { scanf("%d",&k); if( k<0 ) profit.add( i,profit.ED,-k ); else{ profit.add(profit.ST,i,k); sum+=k; } } for( i=1 ;i<=m ;i++ ) { scanf("%d%d",&j,&k); profit.add(j,k,oo); } } void DFS(int v) { vis[v]=1; if( v!=profit.ST && v!=profit.ED ) tot++; int i,j,k; for( NODE *t=profit.g[v] ;t!=NULL ;t=t->next ) if( t->f>0 && !vis[t->ed] ) { DFS(t->ed); } } void doit(){ int i,j,k; k=profit.SAP(); DFS(profit.ST); cout<<tot<<" "<<sum-k<<endl; //printf("%I64d ",tot); //printf("%I64d\n",sum-k); } int main() { init(); doit(); system("pause"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator