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 |
为什么连样例也过不了?纠结了2天了,求大牛来看一下按刘汝佳训练指南写的Dinic #include<cstdio> #include<iostream> #include<vector> #include<cstring> using namespace std; #define N 100+20 #define pb push_back struct edge{int from,to,cap,flow;}; vector<int>G[N]; vector<edge>E; int cur[N],d[N],ps,pt; void add(int a,int b,int c){ E.pb((edge){a,b,c,0});E.pb((edge){b,a,0,0}); int si=E.size(); G[a].pb(si-2);G[b].pb(si-1); } bool bfs(){ int x,f=-1,r=0,i;static int Q[N];Q[0]=ps; memset(d,-1,sizeof(d));d[ps]=0; while(f!=r){x=Q[++f]; for(i=0;i<G[x].size();i++){edge&e=E[G[x][i]]; if(d[e.to]==-1&&e.cap>e.flow){Q[++r]=e.to;d[e.to]=d[x]+1;} } } return d[pt]!=-1; } int dfs(int x,int a){ if(x==pt||a==0)return a; int flow=0,f; for(int&i=cur[x];i<G[x].size();i++){edge&e=E[G[x][i]]; if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow))>0)){ e.flow+=f;E[G[x][i]^1].flow-=f;a-=f;flow+=f; if(a==0)break; } } return flow; } int main(){ freopen("1459.in","r",stdin); freopen("1459.out","w",stdout); int i,n,np,nc,m,ans,a,b,c; while(scanf("%d%d%d%d",&n,&np,&nc,&m)==4){ ps=n;pt=n+1;n+=2; ans=0;E.clear();for(i=0;i<N;i++)G[i].clear(); while(m--){scanf(" (%d,%d)%d",&a,&b,&c);add(a,b,c);} while(np--){scanf(" (%d)%d",&b,&c);add(ps,b,c);} while(nc--){scanf(" (%d)%d",&a,&c);add(a,pt,c);} while(bfs()){ memset(cur,0,sizeof(cur)); ans+=dfs(ps,100000000); } 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