Cod sursa(job #572760)

Utilizator pykhNeagoe Alexandru pykh Data 5 aprilie 2011 16:42:00
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include<cstdio>
#include<bitset>
#include<vector>
using namespace std;

const char in[]="critice.in";
const char out[]="critice.out";

const int Max_N = 1050;
const int INF = 0x3f3f3f3f;

#define pb push_back
#define mp make_pair

bitset<Max_N>viz, viz_st, viz_fi;

vector<int>G[Max_N];
pair<int, int> m[Max_N];

int N, M;
int F[Max_N][Max_N], C[Max_N][Max_N];
int sol[Max_N], T[Max_N], Q[Max_N];


bool BF()
	{
		viz.reset();
		Q[ 0 ] = Q[ 1 ] = 1;
		viz[ 1 ] = true;
		for(int i = 1 ; i <= Q[ 0 ] ; ++i)
		{
			int nod = Q[i];
			if(nod == N) return true;
			for(unsigned j = 0 ; j < G[nod].size() ; ++j)
			{
				int V = G[nod][j];
					if(viz[ V ] || F[ nod ] [ V ] == C[ nod ] [ V ])continue;
						viz[ V ] = true;
						Q[ ++Q[ 0 ] ] = V;
						T[ V ] = nod;
						if(V == N) return true;
			}
		}
		return false;
}


void bf(int S, bitset<Max_N> &v)
	{
		Q[ 0 ] = 1;
		Q[ 1 ] = S;
		v[ S ] = true;
		for(int i = 1 ; i <= Q[ 0 ] ; ++i)
		{
			int nod = Q[i];
			
			for(unsigned j = 0 ; j < G[nod].size() ; ++j)
			{
				int V = G[nod][j];
					if(v[ V ] || F[ nod ] [ V ] == C[ nod ] [ V ] || F[ V ] [ nod ] == C[ V ] [ nod ])continue;
						v[ V ] = true;
						Q[ ++Q[ 0 ] ] = V;
			}
		}
}

int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		scanf("%d %d", &N, &M);
		
		for(int i = 1 ; i <= M ; ++i)
		{
			int x, y, max_cap;
			scanf("%d %d %d", &x, &y, &max_cap);
			C[x][y] += max_cap;
			C[y][x] += max_cap;
			G[x].pb(y);
			G[y].pb(x);
			m[i] = mp(x, y);
		}
		
		while(BF())
			for(unsigned i = 0 ; i < G[N].size() ; ++i)
			{
				int nod = G[N][i];
				if(F[nod][N] == C[nod][N] || !viz[nod])continue;
				
				int min_f = INF;
				
				for(int i = N ; i != 1 ; i = T[i])
					min_f = min(min_f, C[ T[ i ] ][ i ] - F[ T[ i ] ][ i ] );
				if(!min_f)continue;
				
				for(int i = N ; i != 1	; i = T[i])
				{
					F[ T [ i ] ] [ i ] += min_f;
					F[ i ] [ T [ i ] ] -= min_f;
				}
			}
			
		bf(1, viz_st);
		bf(N, viz_fi);
		
		for(  int i = 1 ; i <= M  ; ++i)
			if((viz_st[m[i].first] && viz_fi[m[i].second]) || (viz_st[m[i].second] && viz_fi[m[i].first]))
				sol[++sol[0]] = i;
		printf("%d\n", sol[0]);
		for(int i = 1 ; i <= sol[ 0 ] ; ++i)
			printf("%d\n", sol[i]);
		return 0;
}