记录编号 430208 评测结果 AAAAAAAAAA
题目名称 运输问题1 最终得分 100
用户昵称 GravatarHallmeow 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2017-07-29 15:29:34 内存使用 1.08 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
#define LL long long
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define N 40000
const int inf=0x7fffffff;
struct haha{
	int next,to,w;
}edge[N];
int head[N],cnt;
int n;
void add(int u,int v,int w){
	edge[cnt].w=w;
	edge[cnt].to=v;
	edge[cnt].next=head[u];
	head[u]=cnt++;
}
int dep[N],ans;
bool bfs(){
	memset(dep,0,sizeof(dep));
	queue<int> q;
	q.push(1);
	dep[1]=1;
	while(!q.empty()){
		int now=q.front();q.pop();
		for(int i=head[now];i!=-1;i=edge[i].next){
			int to=edge[i].to,w=edge[i].w;
			if(w&&(!dep[to])){
				dep[to]=dep[now]+1;
				q.push(to);
				if(to==n){
					return 1;
				}
			}
		}
	}
	return 0;
}
int dfs(int now,int f){
	if(now==n){
		return f;
	}
	int tmp=f;
	for(int i=head[now];i!=-1;i=edge[i].next){
		int to=edge[i].to,w=edge[i].w;
		if(w&&tmp&&dep[to]==dep[now]+1){
			int k=dfs(to,min(w,tmp));
			if(!k){
				dep[to]=0;
				continue;
			}
			edge[i].w-=k;
			edge[i^1].w+=k;
			tmp-=k;
		}
	}
	return f-tmp;
}
/*int hea,tail,que[N];
bool bfs() {
	memset(dep,0,sizeof(dep));
	hea=tail=0;
	que[++tail]=1;
	dep[1]=1;
	while(hea<tail) {
		int opt=que[++hea];
		for(int i=head[opt]; i; i=edge[i].next) {
			if(edge[i].w&&!dep[edge[i].to]) {
				dep[edge[i].to]=dep[opt]+1;
				que[++tail]=edge[i].to;
				if(edge[i].to==n) {
					return 1;
				}
			}
		}
	}
	return 0;
}
int dfs(int opt,int fw) {
	if(opt==n) {
		return fw;
	}
	int tmp=fw,k;
	for(int i=head[opt]; i; i=edge[i].next) {
		if(edge[i].w&&tmp&&dep[edge[i].to]==dep[opt]+1) {
			k=dfs(edge[i].to,min(edge[i].w,tmp));
			if(!k) {
				dep[edge[i].to]=0;
				continue;
			}
			edge[i].w-=k;
			edge[i^1].w+=k;
			tmp-=k;
		}
	}
	return fw-tmp;
}*/
int main(){
	freopen("maxflowa.in","r",stdin);
	freopen("maxflowa.out","w",stdout);
	scanf("%d",&n);
	memset(head,-1,sizeof(head));
	pos(i,1,n){
		pos(j,1,n){
			int x;
			scanf("%d",&x);
			if(x){
				add(i,j,x);
				add(j,i,0);
			}
		}
	}
	while(bfs()){
		ans+=dfs(1,inf);
	}
	cout<<ans;
	return 0;
}