Cod sursa(job #2658021)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 12 octombrie 2020 22:23:21
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

int fl[1002][1002];
int cap[1002][1002];

vector<vector<int>> arcs;
vector<bool> viz;
vector<int> parents;

int n;

bool bfs() {
	int current_node, next_node;

	viz.assign(n+2, 0);
	queue<int> q;

	q.push(1);
	viz[1] = 1;

	while (q.size()) {
		current_node = q.front();
		q.pop();

        if (current_node != n)
            for(int i=0; i<arcs[current_node].size(); ++i) {
                next_node = arcs[current_node][i];

                if (fl[current_node][next_node] != cap[current_node][next_node] && ! viz[next_node]) {
                    parents[next_node] = current_node;
                    viz[next_node] = true;
                    q.push(next_node);
                }
            }
	}

	return viz[n];
}


int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);

	int m, a, b, c, flow = 0, flowmin;
	scanf("%d%d", &n, &m);

	arcs.resize(n+1);
	parents.resize(n+1, 0);

	for(int i=0; i<m; ++i) {
		scanf("%d%d%d", &a, &b, &c);
		cap[a][b] += c;
		arcs[a].push_back(b);
		arcs[b].push_back(a);
	}

	while (bfs())
        for(int j=0; j<arcs[n].size(); ++j) {
            a = arcs[n][j];
            if (viz[a] && cap[a][n] != fl[a][n])
            {
                parents[n] = a;
                flowmin = -1;

                for(int i = n; i!= 1; i = parents[i])
                    if (flowmin == -1 || flowmin > cap[parents[i]][i] - fl[parents[i]][i])
                        flowmin = cap[parents[i]][i] - fl[parents[i]][i];

                if (flowmin > 0)
                    for(int i = n; i != 1; i = parents[i]) {
                        fl[parents[i]][i] += flowmin;
                        fl[i][parents[i]] -= flowmin;
                    }

                flow += flowmin;
            }
        }

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