Cod sursa(job #2647570)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 5 septembrie 2020 12:01:07
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
// optimizare - 100 pct

#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1025;
const int INF = 0x3f3f3f3f;

int C[NMAX][NMAX], F[NMAX][NMAX], TT[NMAX];
int N, M, cd[NMAX], viz[NMAX];

vector<int> G[NMAX];

int BFS () {
	cd[0] = cd[1] = 1;
	memset(viz, 0, sizeof(viz));
	viz[1] = 1;

	for (int i = 1; i <= cd[0]; i++) {
		int nod = cd[i];
        if (nod == N)
            continue;
		for (int j = 0; j < (int)G[nod].size(); j++) {
            int V = G[nod][j];
            if (C[nod][V] == F[nod][V] || viz[V])
                continue;
            viz[V] = 1;
            cd[++cd[0]] = V;
            TT[V] = nod;
        }
	}

	return viz[N];
}

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, z;
		scanf("%d%d%d", &x, &y, &z);
		C[x][y] += z;
		G[x].push_back(y);
		G[y].push_back(x);
	}

	int flow = 0;
	for (; BFS(); )
		for (int i = 0; i < (int)G[N].size(); i++) {
			int nod = G[N][i];
			if (F[nod][N] == C[nod][N] || !viz[nod])
                continue;
			TT[N] = nod;

			int fmin = INF;
			for (nod = N; nod != 1; nod = TT[nod])
				fmin = min(fmin, C[TT[nod]][nod] - F[TT[nod]][nod]);
			if (fmin == 0)
                continue;

			for (nod = N; nod != 1; nod = TT[nod]) {
				F[TT[nod]][nod] += fmin;
				F[nod][TT[nod]] -= fmin;
			}

			flow += fmin;
		}

	printf("%d", flow);
	return 0;
}