Cod sursa(job #1153785)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 25 martie 2014 18:48:54
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 1005;
const int INF = (1<<30)-1;

int MAX_FLOW=0;
int n, m, C[MAXN][MAXN], F[MAXN][MAXN], TT[MAXN];
vector<int> G[MAXN];

void read()
{
	ifstream fin("maxflow.in");
	fin>>n>>m;
	for (int i=1; i<=m; ++i)
	{
		int x,y,cap;
		fin>>x>>y>>cap;
		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y]=cap;
	}
	fin.close();
}
void write()
{
	ofstream fout("maxflow.out");
	fout<<MAX_FLOW<<'\n';
	fout.close();
}

bool bfs()
{
	for (int i=1; i<=n; TT[i]=0, ++i);

	queue<int> q;

	q.push(1);
	while (!q.empty())
	{
		int u=q.front();
		for (auto v : G[u])
		{
			if (!TT[v] && F[u][v]<C[u][v])
			{
				TT[v]=u;
				q.push(v);
			}
		}
		q.pop();
	}
	return (TT[n]!=0);
}

void ek()
{
	while (bfs())
	{
        for (auto nod: G[n])
        {
            //DACA NU E DIN DRUM
            if (F[nod][n]==C[nod][n] || !TT[nod])
                continue;

            TT[n]=nod;

            int increment=INF;
            for (int nod=n; nod!=1; nod=TT[nod])
                increment=min(increment, C[TT[nod]][nod]-F[TT[nod]][nod]);

            if (increment==0)
                continue;

            for (int nod=n; nod!=1; nod=TT[nod])
            {
                F[TT[nod]][nod]+=increment;
                F[nod][TT[nod]]-=increment;
            }
            MAX_FLOW+=increment;
        }
	}
}

int main()
{
	read();
	ek();
	write();
	return 0;
}