Cod sursa(job #220550)

Utilizator andrei.12Andrei Parvu andrei.12 Data 11 noiembrie 2008 15:45:37
Problema Critice Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<stdio.h>

#define lg 1005

int n, m, i, d[lg][lg], v[lg][lg], mc[lg*10][2], x, y, c, sol[lg*10], q[lg], tt[2][lg], f;

int find(int s){
	int fst[lg] = {0}, p = 0, r = 1, x, y, i, prd[lg] = {0};

	if (!s)
		q[r] = 1, y = n;
	else
		q[r] = n, y = 1;
	fst[q[r]] = 1;

	while (p < r){
		x = q[++ p];
		//printf("%d\n", x);
		int k = 0;

		for (i = 1; i <= v[x][0]; i ++){
			int go = 0;
			if (!s && d[x][v[x][i]] > 0)
				go = 1;
			if (s == 1 && d[v[x][i]][x] > 0)
				go = 1;

			if (go == 1 && !fst[v[x][i]]){
				fst[v[x][i]] = k = 1;
				prd[v[x][i]] = x;

				q[++ r] = v[x][i];
				if (s == 0 && v[x][i] == n){
					p = r;
					break;
				}
			}
		}
		if (!k && f == 1)
			tt[s][x] = 1;
	}
	
	if (f == 1)
		return 0;
	int mn = 0x3f3f3f3f;
	for (x = y; prd[x]; x = prd[x])
		mn = d[prd[x]][x] < mn ? d[prd[x]][x] : mn;
	if (mn == 0x3f3f3f3f)
		return 0;

	for (x = y; prd[x]; x = prd[x]){
		d[prd[x]][x] -= mn;
		d[x][prd[x]] += mn;
	}

	return mn;
}

int main()
{
	freopen("critice.in", "rt", stdin);
	freopen("critice.out", "wt", stdout);

	scanf("%d%d", &n, &m);
	for (i = 1; i <= m; i ++){
		scanf("%d%d%d", &x, &y, &c);

		d[x][y] = d[y][x] = c;
		v[x][++ v[x][0]] = y;
		v[y][++ v[y][0]] = x;

		mc[i][0] = x, mc[i][1] = y;
	}

	do{
		x = find(0);
//		printf("%d\n", x);
	}
	while (x);
	
	f = 1;
	find(0);
	find(1);
/*	
	for (i = 1; i <= n; i ++)
		if (tt[1][i])
			printf("%d\n", i);
*/
	for (i = 1; i <= m; i ++){
		x = mc[i][0], y = mc[i][1];
		if ((tt[0][x] == 1 && tt[1][y] == 1) || (tt[0][y] == 1 && tt[1][x] == 1))
			sol[++ sol[0]] = i;
	}

	printf("%d\n", sol[0]);
	for (i = 1; i <= sol[0]; i ++)
		printf("%d\n", sol[i]);

	return 0;
}