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 |
求大牛指点接下来怎么做! 用dinic模板写的最大流!然后不知道怎么判别输入输出边!建图的时候已经把输入 和输出边的点分开了 就是不知道怎么继续了!!求教啊! #include <iostream> using namespace std; const int maxn=60500; const int inf=1<<30; struct edge { int from,to,val,next; }map[maxn]; int vis[500],que[500],dist[500],len; int wIn[500],wOut[500]; int mark[500]; int S,T; int M,N; int edg[5001][2]; void init() { len=0; memset(vis,-1,sizeof(vis)); } void insert (int from,int to,int val) //从from 到 to { map[len].from=from; map[len].to=to; map[len].val=val; map[len].next=vis[from]; vis[from]=len++; map[len].from=to; map[len].to=from; map[len].val=0; map[len].next=vis[to]; vis[to]=len++; } int Dinic(int n,int s,int t) { int ans=0; while(true) { int head,tail,id,i; head=tail=0; que[tail++]=s; memset(dist,-1,sizeof(dist)); dist[s]=0; while(head<tail) { id=vis[que[head++]]; while(id!=-1) { if(map[id].val>0&&dist[map[id].to]==-1) { dist[map[id].to]=dist[map[id].from]+1; que[tail++]=map[id].to; if(map[id].to==t) { head=tail; break; } } id=map[id].next; } } if(dist[t]==-1) break; id=s,tail=0; while(true) { if(id==t) //找到一条增广路 { int flow=inf,fir; for(i=0;i<tail;i++) if(map[que[i]].val<flow) { fir=i; flow=map[que[i]].val; } for(i=0;i<tail;i++) map[que[i]].val-=flow,map[que[i]^1].val+=flow; ans+=flow; tail=fir; id=map[que[fir]].from; } id=vis[id]; while(id!=-1) { if(map[id].val>0&&dist[map[id].from]+1==dist[map[id].to]) break; id=map[id].next; } if(id!=-1) { que[tail++]=id; id=map[id].to; } else { if(tail==0) break; dist[map[que[tail-1]].to]=-1; id=map[que[--tail]].from; } } } return ans; } void CreatGraph() {// 建图 int i, ii; S = 0; T = 2 * N + 1; len = 0; for (i = 1; i <= N; i++) { ii = i + N; insert(S, ii, wOut[i]); insert(i, T, wIn[i]); } for (i = 1; i <= M; i++) { ii = edg[i][0] + N; insert(ii, edg[i][1], 0xffffff); } } int main() { init(); int i, num; int cnt[500]; scanf("%d%d", &N, &M); for (i = 1; i <= N; i++) scanf("%d", &wIn[i]); for (i = 1; i <= N; i++) scanf("%d", &wOut[i]); for (i = 1; i <= M; i++) scanf("%d%d", &edg[i][0], &edg[i][1]); CreatGraph(); int ans=Dinic(T,S,T); cout<<ans<<endl; return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator