Cod sursa(job #287078)

Utilizator katakunaCazacu Alexandru katakuna Data 24 martie 2009 15:48:25
Problema Critice Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
using namespace std;
#include <cstdio>
#include <algorithm>
#include <vector>

#define MAX_N 1010
#define MAX_M 10010
#define INF 1<<30

struct muchie {int n1,n2;} mu[MAX_M];
int n, m, x, y, z, i, nrcritice, fiu, nod, Min, t;
int sol[MAX_M], d[MAX_N], s[MAX_N], T[MAX_N], C[MAX_N][MAX_N], F[MAX_N][MAX_N], q[MAX_N];
vector <int> V[MAX_N];

void citire(){

	FILE *f = fopen("critice.in", "r");
	
	fscanf(f,"%d %d",&n,&m);
	for(i=1; i<=m; i++){
		fscanf(f,"%d %d %d",&x, &y, &z);
		mu[i].n1 = x; mu[i].n2 = y;
		C[x][y] = z; C[y][x] = z;		
		V[x].push_back(y); V[y].push_back(x);
	}
	
	fclose(f);
}

int BFS(){

	memset(T, 0xff, (n+2) * sizeof(int));
	int p = 1, u = 1, ok = 0, i;
	q[1] = 1; T[1] = 0;
	
	for(; p <= u; p++){
		nod = q[p];
		for( i = 0; i < (int)V[nod].size(); i++){
			fiu = V[nod][i];
			if( T[fiu] == -1 && C[nod][fiu] > F[nod][fiu] ){
				if( fiu == n ){ ok = 1; continue;} 
				q[++u] = fiu;
				T[fiu] = nod;
			}
		}
	}

	return ok;
}

void flux(){

	while( BFS() )
		for(i = 0; i < (int)V[n].size(); i++){
			fiu = V[n][i];
			if( T[fiu] && C[fiu][n] > F[fiu][n] ){
				T[n] = fiu;
				for(t = n, Min = INF; T[t] != 0; t = T[t] )
					Min = min(Min, C[T[t]][t] - F[T[t]][t]);
				
				for( t = n; T[t] != 0; t = T[t] )
					F[T[t]][t]+=Min, F[t][T[t]]-=Min;
				
			}
			
		}		

}

void critice(){

	int p, u, i;
	p = u = 1; q[1] = 1; s[1] = 1;
	
	for( ; p <= u ;p++ ){
		nod = q[p];
		for(i = 0; i < (int)V[nod].size(); i++){
			fiu = V[nod][i];
			if( !s[fiu] && C[nod][fiu] > F[nod][fiu] ){
				q[++u] = fiu;
				s[fiu] = 1;
			}
		}		
	}

	p = u = 1; q[1] = n; d[n] = 1;
	
	for( ; p <= u ;p++ ){
		nod = q[p];
		for(i = 0; i < (int)V[nod].size(); i++){
			fiu = V[nod][i];
			if( !d[fiu] && C[nod][fiu] > F[nod][fiu] ){
				q[++u] = fiu;
				d[fiu] = 1;
			}
		}		
	}
	
	for(i=1; i <= m; i++){
		x = mu[i].n1 ; y =mu[i].n2;
		if( (s[x] && d[y] && C[x][y] == F[x][y] ) || (s[y] && d[x] && C[y][x] == F[y][x] ) )
			sol[++nrcritice] = i;			
	}
	
}

void afisare(){

	FILE *g = fopen("critice.out", "w");
	
	fprintf(g,"%d\n",nrcritice);
	for(i=1; i<=nrcritice; i++)
		fprintf(g,"%d\n",sol[i]);
	
	fclose(g);
	
}

int main(){

	citire();
	flux();
	critice();
	afisare();
	
	return 0;

}