Cod sursa(job #783535)

Utilizator danalex97Dan H Alexandru danalex97 Data 3 septembrie 2012 10:05:49
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

const int Nmax = 1011;
const int Mmax = 10011;
const int oo=1<<30;

vector<int> Leg[Nmax];
vector< pair<int,int> > Muchii;

int Cap[Nmax][Nmax];
int Dad[Nmax],cd[Nmax];
int Marked[Nmax];
int Marked2[Nmax];

int Fmin,Co,N,M;
vector<int> St;

ifstream F("critice.in");
ofstream G("critice.out");

int BF()
{
	int i, j, nod, V;

	cd[0] = 1;
	cd[1] = 1;
	memset(Marked, 0, sizeof(Marked));
	Marked[1] = 1;

	for (i = 1; i <= cd[0]; i++)
	{
		nod = cd[i];
		if (nod == N) continue;
		
		for (j = 0; j < int(Leg[nod].size()); j++) 
			{
				V = Leg[nod][j];
				if ( Cap[nod][V]==0 || Marked[V]) continue;
				Marked[V] = 1;
				cd[ ++cd[0] ] = V;
				Dad[V] = nod;
			}
	}

	return Marked[N];
}

void BF2()
{
	int i, j, nod, V;

	cd[0] = 1;
	cd[1] = N;
	Marked2[N] = 1;

	for (i = 1; i <= cd[0]; i++)
	{
		nod = cd[i];
		if (nod == 1) continue;
		
		for (j = 0; j < int( Leg[nod].size() ); j++) 
			{
				V = Leg[nod][j];
				if ( Cap[nod][V]==0 || Marked2[V]) continue;
				Marked2[V] = 1;
				cd[ ++cd[0] ] = V;
				Dad[V] = nod;
			}
	}
}

int main()
{
	F>>N>>M;
	for (int i=1;i<=M;++i)
	{
		int x,y,c;
		F>>x>>y>>c;
		Leg[x].push_back( y );
		Leg[y].push_back( x );
		Cap[x][y]=c;
		Cap[y][x]=c;
		Muchii.push_back( make_pair( x,y ) );
	}
	
	while ( BF() )
		for ( int i=0;i<int( Leg[N].size() );++i )
		{
			int Nod=Leg[N][i];
			
			if ( Cap[Nod]==0 || !Marked[Nod] ) continue;
			
			Dad[N]=Nod;
			Fmin=oo;
			
			for (int Act=N; Act!=1; Act=Dad[Act] ) 
				Fmin=min( Fmin, Cap[ Dad[Act] ][Act] );
			if ( Fmin == 0 ) continue;
			
			for (int Act = N; Act != 1; Act = Dad[Act])
			{
				Cap[ Dad[Act] ][Act] -= Fmin;
				Cap[Act][ Dad[Act] ] += Fmin;
			}
		}
	
	BF();
	BF2();
	
	for (int i=0;i<M;++i)
	{
		int j=Muchii[i].first;
		int k=Muchii[i].second;
		if ( ( Marked[j] && Marked2[k] && !Cap[j][k] ) || ( Marked[k] && Marked2[j] && !Cap[k][j] ) )
			++Co,St.push_back( i+1 );
	}		
	
	G<<Co<<'\n';
	for (int i=0;i<Co;++i)
		G<<St[i]<<'\n';
}