Cod sursa(job #727406)

Utilizator algotrollNume Fals algotroll Data 27 martie 2012 22:28:55
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#define _NM 5001
#define INF 2147483647
using namespace std;

int nN,nM;
vector<int> vAd[_NM];
int spare[_NM][_NM];

int path_imp();
int main()
{
	ifstream fin("maxflow.in");
	ofstream fout("maxflow.out");
	fin>>nN>>nM;
	for (int i=1;i<=nM;i++)
	{
		int nod1,nod2,cap;
		fin>>nod1>>nod2>>cap;
		spare[nod1][nod2]=cap;
		vAd[nod1].push_back(nod2);
		vAd[nod2].push_back(nod1);
	}
	int flow=0;
	while(1)
	{
		int imp=path_imp();
		if (imp==0) break;
		flow+=imp;
	}
	fout<<flow;
	return 0;
}

int path_imp()
{
	queue<int> q; bool in_q[_NM];
	for (int i=1;i<=nN;i++) in_q[i]=0;
	q.push(1); in_q[1]=1;//source
	int prev[_NM]; prev[1]=0;
	while (1)
	{
		if (q.empty()) return 0;
		int cur=q.front(); q.pop();
		for (vector<int>::iterator it=vAd[cur].begin();it!=vAd[cur].end();++it)
		{
			if (in_q[*it]||spare[cur][*it]==0) continue;
			prev[*it]=cur;
			if (*it==nN) //sink
				goto endwhile;
			q.push(*it); in_q[*it]=1;
		}
	}
	endwhile:
	
	int minflow=INF;
	int cur=nN;
	while (prev[cur]!=0)
	{
		minflow=min(minflow, spare[prev[cur]][cur]);
		cur=prev[cur];
	}
	
	cur=nN;
	while (prev[cur]!=0)
	{
		spare[prev[cur]][cur]-=minflow;
		spare[cur][prev[cur]]+=minflow;
		cur=prev[cur];
	}
	return minflow;
}