Cod sursa(job #2049665)

Utilizator proflaurianPanaete Adrian proflaurian Data 27 octombrie 2017 15:21:35
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<bits/stdc++.h>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

const int N = 1001;
vector<int> v[N];

queue<int> Q;

int n , m , FL, t[1001], C[1001][1001], F[1001][1001], BF();

void UPD();

int main()
{
	int X,Y,Z;
	f>>n>>m;
	for(;m;m--)
	{
		f>>X>>Y>>Z;
		v[X].push_back(Y);
		v[Y].push_back(X);
		C[X][Y]=Z;
	}

    while(BF())
        UPD();

	g<<FL<<'\n';

	return 0;
}

int BF()
{
	int nod;
	for(int i=2;i<=n;i++)t[i]=0;
	t[1]=-1;
    queue<int> Q;
	Q.push(1);

    for(;Q.size();)
    {
		nod=Q.front();Q.pop();
		for(auto vec :v[nod])
		{
			if(t[vec])continue;
			if(C[nod][vec]==F[nod][vec])continue;

			t[vec]=nod;

			Q.push(vec);

			//if(vec==n)return 1;
		}

    }

    return t[n];
}

void UPD()
{
	int i,j,FC;

	for(i=1;i<=n;i++)
	{
		if(!t[i])continue;

		if(C[i][n]==F[i][n])continue;

		FC=C[i][n]-F[i][n];
		for(j=i;j!=1;j=t[j])
			FC=min(FC,C[t[j]][j]-F[t[j]][j]);

		if(!FC)continue;

		FL+=FC;

		F[i][n]+=FC;F[n][i]-=FC;

		for(j=i;j!=1;j=t[j])
		{
			F[t[j]][j]+=FC;
			F[j][t[j]]-=FC;
		}
	}
}