Cod sursa(job #572714)

Utilizator pykhNeagoe Alexandru pykh Data 5 aprilie 2011 16:06:06
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 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;
bitset<Max_N>viz_st;
bitset<Max_N>viz_fi;*/

bool viz[Max_N], viz_st[Max_N], viz_fi[Max_N];
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();
		memset(viz, 0, sizeof(viz));
		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 i = 0 ; i < G[nod].size() ; ++i)
			{
				int V = G[nod][i];
					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, bool *v)
	{
		Q[ 0 ] = Q[ 1 ] = S;
		v[ 1 ] = true;
		for(int i = 1 ; i <= Q[ 0 ] ; ++i)
		{
			int nod = Q[i];
			
			for(unsigned i = 0 ; i < G[nod].size() ; ++i)
			{
				int V = G[nod][i];
					if(!v[ V ] && (F[ nod ] [ V ] < C[ nod ] [ V ] && F[ V ] [ nod ] < C[ V ] [ nod ]))
					{
						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;
				}
			}
		
		/*Q[ 0 ] = Q[ 1 ] = 1;
		viz_st[ 1 ] = true;
		for(int i = 1 ; i <= Q[ 0 ] ; ++i)
		{
			int nod = Q[i];
			
			for(int i = 0 ; i < G[nod].size() ; ++i)
			{
				int V = G[nod][i];
					if(!viz_st[ V ] && F[ nod ] [ V ] < C[ nod ] [ V ])
					{
						viz_st[ V ] = true;
						Q[ ++Q[ 0 ] ] = V;
					}
			}*/
			
		bf(1, viz_st);
		bf(N, viz_fi);
		
		
		
		for(  int it = 1 ; it <= N  ; ++it)
			if((F[ m[it].first][ m[it].second ] == C[ m[it].first][m[it].second ] && 
				viz_st[ m[it].first] &&  viz_fi[ m[it].second]) || 
				(F[ m[it].second][m[it].first ] == C[ m[it].second][ m[it].first ] && 
				viz_st[ m[it].second] &&  viz_fi[m[it].first]))
				sol[ ++sol[ 0 ] ] = it;
			
		printf("%d\n", sol[0]);
		for(int i = 1 ; i <= sol[ 0 ] ; ++i)
			printf("%d\n", sol[i]);
		return 0;
}