COGS[11] 运输问题1
最大流Dinic模板。
// q.c #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #define mem(a) memset(a,0,sizeof(a)) using namespace std; const int M=100+10,INF=(int)1e9; /********************************************************************************/ struct Edge { int u,v,nex,flow,cap; Edge() {} Edge(int a,int b,int c,int d,int e):u(a),v(b),nex(c),flow(d),cap(e) {} }ed[M*M<<1]; int cnt,head[M]; void add_edge(int a,int b,int c) { ed[cnt]=Edge(a,b,head[a],0,c); head[a]=cnt++; ed[cnt]=Edge(b,a,head[b],0,0); head[b]=cnt++; } /********************************************************************************/ int n,S,T,dis[M],cur[M]; queue<int> Q; bool bfs() { mem(dis); dis[S]=1; Q.push(S); int i,u; Edge e; while(!Q.empty()) { u=Q.front(); Q.pop(); for(i=head[u];~i;i=ed[i].nex) { e=ed[i]; if(e.cap>e.flow&&!dis[e.v]) { dis[e.v]=dis[u]+1; Q.push(e.v); } } } return dis[T]; } int dfs(int u,int lim) { if(u==T||!lim) return lim; int res=0,tmp=0; Edge e; for(int &i=cur[u];~i;i=ed[i].nex) { e=ed[i]; if(dis[e.v]==dis[u]+1) { res=dfs(e.v,min(lim,e.cap-e.flow)); if(res>0) { ed[i].flow+=res,tmp+=res; ed[i^1].flow-=res,lim-=res; if(!lim) break; } } } return tmp; } int solve(int s,int t) { S=s,T=t; int ans=0,i; while(bfs()) { for(i=1;i<=n;i++) cur[i]=head[i]; ans+=dfs(S,INF); } return ans; } /********************************************************************************/ int main() { freopen("maxflowa.in","r",stdin); freopen("maxflowa.out","w",stdout); memset(head,-1,sizeof(head)); int x; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&x); if(x) add_edge(i,j,x); } printf("%d\n",solve(1,n)); return 0; }