Cod sursa(job #1565423)

Utilizator SilviuIIon Silviu SilviuI Data 10 ianuarie 2016 19:07:17
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <cstring>
#include <vector>
#include <queue>
#define nmax 1010

using namespace std;

int n,m,x,y,z;
int fr[nmax];
int capacity[nmax][nmax],flux[nmax][nmax],tata[nmax];
vector <int> g[nmax],gt[nmax];

bool bfs()
{
	memset(fr,0,sizeof(fr));
	queue <int> que; 
	fr[1]=1; que.push(1);
	while (!que.empty()) {
		int x=que.front(); que.pop();
		for (unsigned i=0;i<g[x].size();i++)
		    if (fr[g[x][i]]==0 && capacity[x][g[x][i]]!=flux[x][g[x][i]]) {
		    	fr[g[x][i]]=1; tata[g[x][i]]=x; que.push(g[x][i]);
			}
	}
	return (fr[n]==1);
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (int i=1;i<=m;i++) {
		scanf("%d %d %d",&x,&y,&z);
		capacity[x][y]+=z; g[x].push_back(y); gt[y].push_back(x);
	}
	int fmax=0;
	while (bfs()) {
		for (unsigned int i=0;i<gt[n].size();i++) 
		if (fr[gt[n][i]]==1 && capacity[gt[n][i]][n]!=flux[gt[n][i]][n]){
			int fmin=2e9; tata[n]=gt[n][i];
			for (int j=n;j>1;j=tata[j])
			    fmin=min(fmin,capacity[tata[j]][j]-flux[tata[j]][j]);
			if (fmin==0) continue;
			for (int j=n;j>1;j=tata[j]) {
				flux[tata[j]][j]+=fmin;
				flux[j][tata[j]]-=fmin;
			}
			fmax=fmax+fmin;
		}
	}
	printf("%d",fmax);
	return 0;
}