Cod sursa(job #526045)

Utilizator cosmyoPaunel Cosmin cosmyo Data 27 ianuarie 2011 10:33:18
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#define f first
#define s second
using namespace std;
const int N = 1005;
const int INF = 0x3f3f3f3f;
int n, m, c[N][N], f[N][N], t[N], v[N], x[N], y[N];
vector<int> a[N];
pair<int, int> P[N * 10];
int BFS() {
	int i, j, k;
	int cd[N];
	cd[0] = 1;	cd[1] = 1;
	for(i = 1; i <= n; ++i)
		v[i] = t[i] = 0;
	v[1] = 1;
	for(j = 1; j <= cd[0]; ++j) {
		k = cd[j];
		if(k == n)
			return 1;
		for(i = 0; i < a[k].size(); ++i)
			if(!v[a[k][i]] && f[k][a[k][i]] < c[k][a[k][i]]) {
				cd[++cd[0]] = a[k][i];
				v[a[k][i]] = 1;
				t[a[k][i]] = k;
			}
	}
	
	return v[N];
}

void bfs(int st, int A[N]) {
	int cd[N], i, k, j;
	cd[0] = 1;	cd[1] = st;
	for(i = 1; i <= n; ++i)
		v[i] = 0;
	for(j = 1; j <= cd[0]; ++j) {
		k = cd[j];
		v[k] = 1;
		for(i = 0; i < a[k].size(); ++i){
			if(!v[a[k][i]]) {
				cd[++cd[0]] = a[k][i];
				if(c[k][a[k][i]] - abs(f[k][a[k][i]]) >0) 
					A[a[k][i]] = 1;
			}
		}
	}
	A[st] = 1;
}

int main() {
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);
	int i, j, X, Y, C, k, flux = 0, r;
	scanf("%d %d", &n, &m);
	for(i = 1; i <= m; ++i)
		scanf("%d %d %d", &X, &Y, &C),	P[i].f= X,	P[i].s = Y, 		c[X][Y] = C,	c[Y][X] = C,	a[X].push_back(Y),	a[Y].push_back(X);
	
	for(; BFS(); ) 
		for( i = 0; i < a[n].size(); ++i)
			if(v[a[n][i]] && f[a[n][i]][n] < c[a[n][i]][n]) {
				t[n] = a[n][i];
				k = n;
				r = INF;
				while(t[k]) {
					r = min(r, c[t[k]][k] - f[t[k]][k]);
					k = t[k];
				}

				k = n;
				while(t[k]) {
					f[t[k]][k] += r;
					f[k][t[k]] -= r;
					k = t[k];
				}
				flux += r;
			}
	bfs(1, x);
	bfs(n, y);
	
	int sol[N * 10], nr = 0;
	for(i = 1; i <= m; ++i){
		if((x[P[i].f] && y[P[i].s] && f[P[i].f][P[i].s] == c[P[i].f][P[i].s]) || (x[P[i].s] && y[P[i].f] && f[P[i].s][P[i].f] == c[P[i].f][P[i].s]) ) 
			sol[++nr] = i;
	//	printf("%d %d %d %d\n",c[P[i].f][P[i].s], f[P[i].f][P[i].s], f[P[i].s][P[i].f], c[P[i].s][P[i].f]);
	}
//	for(i = 1; i <= n; ++i)
//		printf("%d %d\n", x[i], y[i]);
	printf("%d\n", nr);
	for(i = 1; i <= nr; ++i)
		printf("%d\n",sol[i]); 
}