Cod sursa(job #514829)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 19 decembrie 2010 17:45:23
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const int  nmax    = 1124;
const char iname[] = "critice.in";
const char oname[] = "critice.out";
const int  mmax   = 10024;

//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];
bool viz[nmax], viz2[nmax], viz3[nmax];
int nr[nmax][nmax], reconst[mmax/2], j;
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];
}

bool DF(int nod)
{	
	viz2[nod] = 1;
	for(vector<int>::iterator it2 = Gf[nod].begin(); it2 != Gf[nod].end(); ++ it2)
		if(viz2[*it2] == 0  && F[nod][*it2] < C[nod][*it2] && F[*it2][nod] < C[*it2][nod])	
		{	
			viz2[*it2] = 1;
			DF(*it2);
		}
	return 0;
}

bool DF2(int nod)
{	
	viz3[nod] = 1;
	for(vector<int>::iterator it2 = Gf[nod].begin(); it2 != Gf[nod].end(); ++ it2)
		if(viz3[*it2] == 0 && F[nod][*it2] < C[nod][*it2] && F[*it2][nod] < C[*it2][nod])	
		{	
			viz3[*it2] = 1;
			DF2(*it2);
		}
	return 0;
}



int main()
{	
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for(i = 1; i <= m; i ++)
	{
		scanf("%d %d %d", &x, &y, &c);
		//fin >> x >> y >> c;
		Gf[x].push_back(y);
		Gf[y].push_back(x);
		C[x][y] = c;
		C[y][x] = c;
		nr[x][y] = i;
		nr[y][x] = i;
	}
	
	
	maxflow = 0;
	while(BF() == 1)
	{   
		ct = 0;
		mflow = 108282121;
		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;
		}
	
		maxflow += mflow;
	}
	
	for(i = 1; i <= n; i ++)
		for(j = 0; j < Gf[i].size(); j ++)
		{
			//memset(viz2, 0, sizeof(viz2));
			//memset(viz3, 0, sizeof(viz3));
			if(F[i][Gf[i][j]] == C[i][Gf[i][j]])
			{	
			
				viz2[1] = 1;
				viz3[n] = 1;
				int x1 = DF(1);
				int x2 = DF2(n);
				if((viz2[i] == 1 && viz3[Gf[i][j]] == 1) || (viz2[Gf[i][j]] == 1 && viz3[i] == 1))
					{  
						ind1 = Gf[i][j];
						ind2 = i;
						++sol;
						reconst[sol] = nr[ind1][ind2];
					}

			}
		}
	printf("%d\n", sol);
	sort(reconst + 1, reconst + sol + 1);
	for(i = 1; i <= sol; i ++)
		printf("%d\n", reconst[i]);
	return 0;
}