Cod sursa(job #602428)

Utilizator S7012MYPetru Trimbitas S7012MY Data 11 iulie 2011 14:04:16
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#define DN 1005
using namespace std;

int n,m,fm,cap[DN][DN],fl[DN][DN],pre[DN];

bool bfs() {
	memset(pre,-1,sizeof(pre));
	pre[1]=0;
	queue<int> c;
	for(c.push(1); c.size(); c.pop()) {
		int fr=c.front();
		for(int i=1; i<=n; ++i) if(-1==pre[i] && cap[fr][i]>fl[fr][i]) {
			c.push(i);
			pre[i]=fr;
		}
	}
	return pre[n]!=-1;
}

int main()
{
	ifstream f("maxflow.in");
	ofstream g("maxflow.out");
	f>>n>>m;
	for(int i=1; i<=m; ++i) {
		int x,y,c;
		f>>x>>y>>c;
		cap[x][y]=c;
	}
	int c;
	for(;bfs();) {
		for(int i=1; i<=n; ++i) if(fl[i][n]<cap[i][n]) {
			c=cap[i][n]-fl[i][n];
			for(int y=i;pre[y];y=pre[y]) c=min(c,cap[pre[y]][y]-fl[pre[y]][y]);
			fm+=c;
			fl[i][n]+=c;
			fl[n][i]-=c;
			for(int y=i;pre[y];y=pre[y]) {
				fl[pre[y]][y]+=c;
				fl[y][pre[y]]-=c;
			}
		}
	}
	g<<fm;
	return 0;
}