Cod sursa(job #2901499)

Utilizator tiut_cristianTiut Cristian tiut_cristian Data 13 mai 2022 21:19:47
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int C[1005][1005];
int F[1005][1005];
int TT[1005];
vector<int> G[1005];
int n, m;
queue<int> cd;
bool viz[1005]={0};

int BF()
{
    for(int i = 1; i <= n; i++)
        viz[i] = 0;
	viz[1] = 1;
    cd.push(1);
	while(!cd.empty())
	{
		int nod = cd.front();
        if (nod != n)
            for (int j = 0; j < G[nod].size(); j++)
            {
                int V = G[nod][j];
                if (C[nod][V] != F[nod][V] && !viz[V])
                {
                    viz[V] = 1;
                    cd.push(V);
                    TT[V] = nod;
                }
            }
        cd.pop();
	}
	return viz[n];
}

int main()
{
	int i, flow, fmin, x, y, z, nod;

	fin >> n >> m;

	for (i = 1; i <= m; i++)
	{
		fin >> x >> y >> z;
		C[x][y] += z;
		G[x].push_back(y);
		G[y].push_back(x);
	}

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

			fmin = 550000005;
			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;
		}

	fout << flow;
	return 0;
}