Cod sursa(job #2025717)

Utilizator horiainfoTurcuman Horia horiainfo Data 23 septembrie 2017 10:03:30
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>

#define N 1001
#define INF 550000001 
using namespace std;

int n, m;
vector<int> G[N];
int capacity[N][N], flow[N][N];
int ant[N], fmin[N];

bool BFS(){

	queue<int> que;
	bool ok = 0;
	que.push(1);

	memset(fmin, 0, sizeof(fmin));

	fmin[1] = INF;
	while(!que.empty()){

		int node = que.front();
		que.pop();

		for(auto next : G[node])
			if(fmin[next] == 0 && capacity[node][next] - flow[node][next] != 0){

				if(next == n) {ok = 1; continue;}

				fmin[next] = min(fmin[node], capacity[node][next] - flow[node][next]);
				ant[next] = node;
				que.push(next);
			}
	}

	return ok;
}

int main(){

	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= m; i ++){

		int x, y, c;
		scanf("%d%d%d", &x, &y, &c);
		G[x].push_back(y);
		G[y].push_back(x);

		capacity[x][y] = c;
	}

	int maxFlow = 0;
	while(BFS()){

		for(auto next : G[n])
			if(fmin[next] != 0){

				int node = n;
				ant[n] = next;
				maxFlow += fmin[next];

				while(node != 1){

					flow[node][ant[node]] -= fmin[next];
					flow[ant[node]][node] += fmin[next];

					node = ant[node];
				}
			}
	}

	printf("%d", &maxFlow);
	return 0;
}