ZOJ 1532 Internship (Dinic)
看来模板又错了,敲你妈妈小饼干
#include<iostream> #include<queue> #include<cstring> #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> #include<stack> #include<vector> #include<map> using namespace std; const int inf = 0x3f3f3f3f ; struct node { int u,v,Flow,next; }; node Li[3000]; int Head[110],top; int vis[110],ans[110]; bool vis1[110],vis2[110]; int n,m,l; int s,t; void Add(int u,int v,int f) { Li[top].v=v; Li[top].u=u; Li[top].Flow=f; Li[top].next=Head[u]; Head[u]=top++; } bool BFS() { memset(vis,-1,sizeof(vis)); vis[s]=0; queue<int>q; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=Head[u]; i!=-1; i=Li[i].next) { if(Li[i].Flow&&vis[Li[i].v]==-1) { vis[Li[i].v]=vis[u]+1;/**为何要如此标记?改**/ q.push(Li[i].v); } } } return vis[t]!=-1; } int DFS(int u,int f) { if(u==t) { return f; } int ans=0; for(int i=Head[u]; i!=-1; i=Li[i].next) { if(Li[i].Flow&&vis[Li[i].v]==vis[u]+1) { int d=DFS(Li[i].v,min(f,Li[i].Flow)); f-=d; Li[i].Flow-=d; Li[i^1].Flow+=d;//神奇呀!!!!!! ans+=d; } } return ans; } void dfs(int u,bool *vist,int op) { vist[u]=true; for(int i=Head[u]; i!=-1; i=Li[i].next) { if(!vist[Li[i].v]&&Li[i^op].Flow!=0) { dfs(Li[i].v,vist,op); } } } void Dinic() { int ans; while(BFS()) { ans=DFS(s,inf); } } int main() { while(scanf("%d%d%d",&n,&m,&l)!=EOF&&n) { s=n+m+1; t=0; memset(Head,-1,sizeof(Head)); int a,b,c; top = 0; for(int i=0; i<l; i++) { scanf("%d%d%d",&a,&b,&c); Add(a,b,c); Add(b,a,0); } for(int i=1; i<=n; i++) { Add(s,i,inf); Add(i,s,0); } Dinic(); memset(vis1,0,sizeof(vis1)); memset(vis2,0,sizeof(vis2)); dfs(s,vis1,0); dfs(t,vis2,1); int num = 0; for(int i=0; i<l; i++) { if(Li[i<<1].Flow==0){ Li[i<<1].Flow=1; if(BFS())ans[num++]=i+1; Li[i<<1].Flow=0; } } if(num) { for(int i=0; i<num; i++) { if(i) { printf(" "); } printf("%d",ans[i]); } } printf("\n"); } }
如需转载,请注明出处
如有侵权,联系删除
2290713181@qq.com
如有侵权,联系删除
2290713181@qq.com