Cod sursa(job #671878)

Utilizator informatician28Andrei Dinu informatician28 Data 31 ianuarie 2012 23:51:36
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<fstream> 
#include<vector> 
#include<queue> 
#include<cstring>
#define DIM 1001
#define pb push_back
#define INF 0x3f3f3f3f

using namespace std; 
ifstream in("critice.in"); 
ofstream out("critice.out"); 

int N, M; 
int C[DIM][DIM], F[DIM][DIM], T[DIM], edges[DIM][DIM]; 
int T1[DIM], T2[DIM]; 
vector< int > G[DIM], sol;

void Read()
{
	int i, x, y, c; 
	in >> N >> M; 
	for(i = 1; i <= M; i++) 
	{
		in >> x >> y >> c; 
		G[x].pb(y); 
		G[y].pb(x); 
		C[x][y] = C[y][x] = c; 
		edges[x][y] = edges[y][x] = i;
	}
}
int BFs(int S, int D, int *T ) 
{
	queue<int> Q; 
	Q.push(S); 
	T[S] = S;
	while( !Q.empty() ) 
	{
		int nod = Q.front(); 
		Q.pop();
		if( nod == D ) return 1;
        for(vector< int >:: iterator it = G[nod].begin(); it != G[nod].end(); ++it)		
		if( F[nod][*it] < C[nod][*it] && !T[*it] ) 
		{
			Q.push(*it); 
			T[*it] = nod; 
		}
	}
	return 0; 
}
void Solve() 
{
	int fmin, i, nod ; 
	while( BFs(1, N, T) ) 
	{
		fmin = INF; 
		for(nod = N; nod != 1; nod = T[nod] )
			fmin = min( fmin, C[T[nod]][nod] - F[T[nod]][nod] ); 
		for(nod = N; nod != 1; nod = T[nod] ) 
		{
			F[T[nod]][nod] += fmin; 
			F[nod][T[nod]] -= fmin; 
		}
		memset(T, 0, sizeof(T));
	}
	
	BFs(1, N, T1); 
	BFs(N, 1, T2); 
	for(i = 1; i <= N; i++) 
		for(vector< int > :: iterator it = G[i].begin(); it != G[i].end(); ++it) 
			if( C[i][*it] == F[i][*it] && T1[i] && T2[*it] ) 
				sol.pb( edges[i][*it] );			
}
int main() 
{
	Read();
	Solve();
	out << sol.size() << '\n';
	for(vector<int>::iterator it = sol.begin(); it != sol.end(); ++it) 
		out << *it << '\n'; 
	return 0; 
}