Cod sursa(job #514699)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 19 decembrie 2010 13:54:49
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

const int  nmax    = 1024;
const char iname[] = "maxflow.in";
const char oname[] = "maxflow.out";

ifstream fin(iname);
ofstream fout(oname);


vector<int> Gf[nmax];
int n, m, i, x, y, maxflow, mflow, c, ct, sol, ind1 , ind2;
int C[nmax][nmax], F[nmax][nmax], T[nmax], viz[nmax];
int nr[nmax][nmax], reconst[nmax];
queue<int> Q;

bool BF()
{	
	int first = 0; //inceputul cozii
	for(i = 1; i <= n; i ++)
		viz[i] = 0;
	//memset(T, 0, sizeof(T));
	Q.push(1);
	viz[1] = 1;
	while(!Q.empty())
	{	
		first = Q.front();
		Q.pop();
		for(vector<int>::iterator it = Gf[first].begin(); it != Gf[first].end(); ++ it)
		{	
			if(C[first][*it] == F[first][*it] || viz[*it])
				continue;
			T[*it] = first;
			viz[*it] = 1;
			Q.push(*it);
			if(*it == n)
				continue;
		}
	}
	return viz[n];
}


int main()
{
	fin >> n >> m;
	for(i = 1; i <= m; i ++)
	{
		fin >> x >> y >> c;
		Gf[x].push_back(y);
		Gf[y].push_back(x);
		C[x][y] = c;
		nr[x][y] = i;
	}
	
	
	maxflow = 0;
	while(BF() == 1)
	{   
		ct = 0;
		mflow = 282822;
		for(i = n; i != 1; i = T[i])
			mflow = min(mflow, C[T[i]][i] - F[T[i]][i]);
		
		for(i = n; i != 1; i = T[i])
		{
			F[T[i]][i] += mflow;
			F[i][T[i]] -= mflow;
		}
		for(i = n; i != 1; i = T[i])
			if(C[T[i]][i] == F[T[i]][i])
			{
				ct ++;
				ind1 = T[i];
				ind2 = i;
				break;
			}
			
		if(ct == 1)
		{
			++sol;
			reconst[sol] = nr[ind1][ind2];
		}
	
		maxflow += mflow;
	}
	
	fout << sol << "\n";
	sort(reconst + 1, reconst + sol + 1);
	for(i = 1; i <= sol; i ++)
		fout << reconst[i] << "\n";
	return 0;
}