Cod sursa(job #616517)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 12 octombrie 2011 19:38:19
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include<stdio.h>
#include<vector>

#define maxn 1005
#define maxm 10005

using namespace std;

FILE*f=fopen("critice.in","r");
FILE*g=fopen("critice.out","w");

int n,m,i,c,nod,nodvcn,ok,minim,p,u;
int X[maxm],Y[maxm],Cp[maxn][maxn],F[maxn][maxn],viz[maxn],C[maxn],T[maxn],r[2][maxn],criticals[maxm],nrc;
vector<int>G[maxn]; vector<int>::iterator itt;

inline void citire () {
	
	fscanf(f,"%d %d",&n,&m); 
	
	for ( i = 1 ; i <= m ; ++i ){
		fscanf(f,"%d %d %d",&X[i],&Y[i],&c);
		G[ X[i] ].push_back(Y[i]);
		G[ Y[i] ].push_back(X[i]);
		Cp[X[i]][Y[i]] = Cp[Y[i]][X[i]] = c;
	}
}

inline bool Bfs () {
	
	for ( i = 1 ; i <= n ; ++i )	viz[i] = 0;
	p = u = 1; C[1] = 1; ok = 0; viz[1] = 1;
	
	while ( p <= u ){
		nod = C[p];
		
		for ( itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
			nodvcn = *itt;
			
			if ( viz[nodvcn] || Cp[nod][nodvcn] == F[nod][nodvcn] )	continue ;
			
			if ( nodvcn == n ){
				ok = 1; continue ;
			}
			viz[nodvcn] = 1; T[nodvcn] = nod;
			C[++u] = nodvcn;
		}
		++p;
	}
	
	return ok;
}

inline void maxflow () {
	
	while ( Bfs() ){
		
		for ( itt = G[n].begin() ; itt != G[n].end() ; ++itt ){
			T[n] = (*itt); nod = n; minim = 1<<30;
			for ( ; T[nod] ; nod = T[nod] ){
				minim = min(minim,Cp[T[nod]][nod]-F[T[nod]][nod]);
			}
			nod = n;
			if ( minim ){
				for ( ; T[nod] ; nod = T[nod] ){
					F[T[nod]][nod] += minim;
					F[nod][T[nod]] -= minim;
				}
			}
		}
	}
}

inline int abs ( int j ){
	if ( j < 0 )
		return -j;
	return j;
}

inline void Bfs2 ( int nod , int tip ){
	
	p = u = 1; C[1] = nod; r[tip][nod] = 1;
	
	while ( p <= u ){
		
		nod = C[p];
		
		for ( itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
			nodvcn = *itt;
			if ( !r[tip][nodvcn] && abs(F[nod][nodvcn]) < Cp[nod][nodvcn] ){
				r[tip][nodvcn] = 1;
				if ( !((nodvcn == n && nod == 1) || (nodvcn == 1 && nod == n)) ){
					C[++u] = nodvcn;
				}
			}
		}
		++p;
	}
}

inline void find_edges () {
	
	Bfs2(1,0); Bfs2(n,1);
	
	for ( i = 1 ; i <= m ; ++i ){
		if ( F[X[i]][Y[i]] == Cp[X[i]][Y[i]] ){
			if ( r[0][X[i]] && r[1][Y[i]] )
				criticals[++nrc] = i;
		}
		if ( F[Y[i]][X[i]] == Cp[X[i]][Y[i]] ){
			if ( r[0][Y[i]] && r[1][X[i]] )
				criticals[++nrc] = i;
		}
	}
	
	fprintf(g,"%d\n",nrc);
	for ( i = 1 ; i <= nrc ; ++i ){
		fprintf(g,"%d\n",criticals[i]);
	}
}

int main () {
	
	citire();
	maxflow();
	find_edges();
	
	fclose(f);
	fclose(g);
	
	return 0;
}