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;
}

 

posted @ 2018-04-21 10:33  qjs12  阅读(79)  评论(0编辑  收藏  举报