Cod sursa(job #1153758)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 25 martie 2014 18:25:21
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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];
}

void ek()
{
	while (bfs())
	{
		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==INF)
            break;

		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;
}