Cod sursa(job #369030)

Utilizator adelinasAdelina Spataru adelinas Data 26 noiembrie 2009 21:42:07
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 1005
#define INF 2000000000
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
vector <int> v[NMAX];
queue <int> q;
int F[NMAX][NMAX], T[NMAX], C[NMAX][NMAX], viz[NMAX], sol[NMAX];
int M[NMAX*10][2];
bool CRT[NMAX][NMAX];
int n, m, k;
int min(int x,int y){
	if(x>y) return y;
	return x;
}
int BFS1(){
	memset(viz, 0, sizeof(viz));
	viz[1] = 1;
	q.push(1);
	while(!q.empty()){
		int nod = q.front();
		q.pop();
		if(nod == n) continue;
		FOR(i, v[nod]){
			if(viz[*i] || C[nod][*i] == F[nod][*i]) continue;
			C[*i][nod]=0;
			T[*i] = nod;
			viz[*i] = 1;
			q.push(*i);
		}
	}
	return viz[n];
}
void BFS2(int start,int fin){
	memset(viz, 0, sizeof(viz));
	viz[start]=1;
	q.push(start);
	while(!q.empty()){
		int nod = q.front();
		q.pop();
		if(nod == fin) continue;
		FOR(i, v[nod]){
			if(viz[*i]) continue;
			if(C[nod][*i] == F[nod][*i] || C[*i][nod] == F[*i][nod]) {
				CRT[nod][*i]=true; //CRT [nod][*i] muchia nod->*i este posibila sa fie critica
				continue;
			}
			viz[*i] = 1;
			q.push(*i);
		}
	}
}
int main(){
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= m; ++i){
		int x, y, z;
		scanf("%d %d %d", &x, &y, &z);
		C[x][y]=z;
		C[y][x]=z;
		v[x].push_back(y);
		v[y].push_back(x);
		M[i][0]=x;
		M[i][1]=y;
	}
	int flow = 0;
	for(; BFS1();)
		FOR(i, v[n]){
			if(F[*i][n] == C[*i][n]) continue;
			int flowm = INF;
			
			for(int j = n; j != 1; j = T[j])
				flowm = min( flowm, C[ T[j] ][ j ] - F[ T[j] ][ j ] );
			for(int j = n; j != 1; j = T[j]){
				F[ T[j] ][ j ] += flowm;
				F[ j ][ T[j] ] -= flowm;
			}
			flow += flowm;
		}
	BFS2(1,n);
	BFS2(n,1);
	for(int i = 1; i <= m; ++i)
		if(CRT[ M[i][0] ][ M[i][1] ] && CRT[ M[i][1] ][ M[i][0] ]) sol[++k] = i;
	printf("%d\n", k);
	for(int i = 1; i <= k; ++i)
			printf("%d\n", sol[i]);
	return 0;
}