Cod sursa(job #2881640)

Utilizator dp_flowRadu Radu dp_flow Data 30 martie 2022 18:16:15
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;

#define Nmax 1003
#define Cmax 110100

int N, M;
vector<int> G[Nmax];
int C[Nmax][Nmax];
int F[Nmax][Nmax];

int vis[Nmax];
int parent[Nmax];


void pushflow() {
	int node = N;
	int prev = parent[node];

	int min_flow = Cmax;

	while(prev != 0) {
		int flow = 0;
		if(F[prev][node] == 0) {
			flow += F[node][prev] + C[prev][node];
		}
		else {
			flow += C[prev][node] - F[prev][node];
		}
		if(flow < min_flow) {
			min_flow = flow;
		}

		node = prev;
		prev = parent[prev];
	}

	node = N;
	prev = parent[node];
	while(prev != 0) {
		if(F[node][prev] == 0) {
			F[prev][node] += min_flow;
		}
		else {
			if(F[node][prev] >= min_flow) {
				F[node][prev] -= min_flow;
			} 
			else {
				int aux = min_flow - F[node][prev];
				F[node][prev] = 0;
				F[prev][node] += aux;
			}
		}

		node = prev;
		prev = parent[prev];
	}
}

int bfs() {
	memset(vis, 0, sizeof(vis));
	memset(parent, 0, sizeof(parent));

	vis[1] = 1;
	parent[1] = 0;

	queue<int> q;
	q.push(1);

	while(!q.empty()) {
		int node = q.front();
		q.pop();
		if(node == N) {
			pushflow();
			return 1;
		}

		for(auto j = G[node].begin(); j != G[node].end(); j++) {
			if(vis[*j] != 1) {
				if(F[node][*j] < C[node][*j] || F[*j][node] > 0) {
					vis[*j] = 1;
					parent[*j] = node;
					q.push(*j);
				}
			}
		}

	}

	return 0;
}

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);
		C[x][y] = c;
	}	

	while(bfs());

	int res = 0;
	for(int i = 2; i <= N; i++) {
		res += F[1][i];
	}
	printf("%d", res);

	/*printf("%d %d\n", N, M);
	for(int i = 1; i <= N; i++) {
		printf("Node %d: ", i);
		for(auto j = G[i].begin(); j != G[i].end(); j++) {
			printf("(%d, %d)  ", *j, F[i][*j]);
		}
		printf("\n");
	}
	return 0;*/
}