Cod sursa(job #915489)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 15 martie 2013 06:25:50
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cstdio>
#include<cassert>
#include<cstring>

#include<vector>
#include<algorithm>
#include<queue>

using namespace std;

int n, m, source, dest, cap[505][505];

void read(){
	assert(freopen("maxflow.in", "r", stdin));
	
	scanf("%d%d", &n, &m);
	
	dest = n;
	source = 1;
	
	for(int i = 1; i <= m; ++i){
		int aux_x, aux_y, aux_cap;
		
		scanf("%d%d%d", &aux_x, &aux_y, &aux_cap);
		cap[aux_x][aux_y] = aux_cap;
	}
	
}

int dad[505], vis[505], fl[505][505];

int bfs(){
	memset(dad, 0, sizeof(dad));
	memset(vis, 0, sizeof(vis));
	dad[source] = -1;
	
	queue<int> q;
	q.push(source);
	vis[source] = 1;
	
	while(!q.empty()){
		int now = q.front();
		q.pop();
		
		for(int i = 1; i <= dest; ++i)
			if(fl[now][i] < cap[now][i] &&  !vis[i]){
				q.push(i);
				vis[i] = 1;
				dad[i] = now;
			}
		
		if(vis[dest])
			return 1;
	}
	
	return 0;
}

int flow;

void solve(){
	while(bfs()){
		int c_flow;
		
		for(int i = 1; i < dest; ++i)
			if(vis[i] && cap[i][dest] > fl[i][dest]){
				c_flow = cap[i][dest] - fl[i][dest];
				for(int j = i; j != source; j = dad[j])
					c_flow = min(c_flow, cap[dad[j]][j] - fl[dad[j]][j]);
				for(int j = i; j != source; j = dad[j]){
					fl[dad[j]][j] += c_flow;
					fl[j][dad[j]] -= c_flow;
				}
				fl[i][dest] += c_flow;
				fl[dest][i] -= c_flow;
				flow += c_flow;
			}
		
	}
	
}

void write(){
	assert(freopen("maxflow.out", "w", stdout));
	
	printf("%d", flow);
}

int main(){
	read();
	solve();
	write();
	
	return 0;
}