记录编号 313527 评测结果 AAAAAAAAAA
题目名称 11.运输问题1 最终得分 100
用户昵称 AntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2016-09-30 16:36:46 内存使用 0.00 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
struct edge{
	int to,prev,cap;
}e[maxn*maxn<<1];
void insert(int,int,int);
int Dinic();
void bfs(int);
int dfs(int,int);
int n,last[maxn],d[maxn],len=0;
int q[maxn],head,tail,now[maxn],s,t,tmp;
bool vis[maxn];
inline int MAIN(){
#define MINE
#ifdef MINE
	freopen("maxflowa.in","r",stdin);
	freopen("maxflowa.out","w",stdout);
#endif
	memset(last,-1,sizeof(last));
	scanf("%d",&n);
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
		scanf("%d",&tmp);
		if(!tmp)continue;
		insert(i,j,tmp);
		insert(j,i,0);
	}
	//scanf("%d",&tmp);while(tmp--){int x,y,z;scanf("%d%d%d",&x,&y,&z);insert(x,y,z);insert(y,x,0);}
	s=1;t=n;
	printf("%d",Dinic());
#ifndef MINE
	printf("\n--------------------DONE--------------------\n");
	for(;;);
#endif
	return 0;
}
int hzoier=MAIN();
int main(){;}
void insert(int x,int y,int z){
	e[len].to=y;
	e[len].prev=last[x];
	e[len].cap=z;
	last[x]=len++;
}
int Dinic(){
	int ans=0;
	for(;;){
		bfs(s);
		if(!vis[t])break;
		memset(now,0,sizeof(now));
		ans+=dfs(s,~(1<<31));
	}
	return ans;
}
void bfs(int x){
	memset(vis,0,sizeof(vis));
	d[x]=0;
	vis[x]=true;
	head=tail=0;
	q[tail++]=x;
	while(head!=tail){
		x=q[head++];
		for(int i=last[x];i!=-1;i=e[i].prev){
			if(e[i].cap<=0||vis[e[i].to])continue;
			vis[e[i].to]=true;
			d[e[i].to]=d[x]+1;
			q[tail++]=e[i].to;
		}
	}
}
int dfs(int x,int delta){
	//printf("dfs(%d) delta=%d d=%d\n",x,delta,d[x]);
	if(x==t||!delta)return delta;
	int flow=0,f;
	for(int i=(now[x]?e[now[x]].prev:last[x]);i!=-1;i=e[i].prev){
		if(d[e[i].to]!=d[x]+1)continue;
		now[x]=i;
		f=dfs(e[i].to,min(delta,e[i].cap));
		if(!f)continue;
		e[i].cap-=f;
		e[i^1].cap+=f;
		delta-=f;
		flow+=f;
		if(!delta)break;
	}
	return flow;
}
/*
6 7
1 2 10
1 3 10
2 4 4
2 5 8
3 5 9
4 6 10
5 6 10
Answer:
14
*/