Cod sursa(job #318540)

Utilizator CezarMocanCezar Mocan CezarMocan Data 28 mai 2009 18:13:02
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <cstdio>
#include <cstring>
#define maxn 1024
#define inf 2000000000

using namespace std;

struct muchie {
	int x, y, z;
};

int n, m, i, j, k, p, u, a, b, cc;
int c[maxn][maxn];
int flux[maxn], up[maxn], q[maxn], futot;
int ok;
int m1[maxn], m2[maxn], tip[maxn];
muchie mu[10100];

void init() {
	memset(flux, 0, sizeof(flux));
	flux[1] = inf;
	memset(up, -1, sizeof(up));
}

inline int min(int a, int b) {
	if (a < b)
		return a;
	return b;
}

bool bfs() {
	int nod, fiu, p, u, i;
	p = u = 1;
	q[1] = 1;
	while (p <= u) {
		nod = q[p];
		for (i = 1; i <= n; i++) 
			if (c[nod][i] > 0) {
				fiu = i;
				if (flux[fiu] == 0) {
					flux[fiu] = min(c[nod][fiu], flux[nod]);
					up[fiu] = nod;
					u++;
					q[u] = fiu;
					if (fiu == n) {
						p = u + 1;
						break;
					}
				}
			}
		p++;
	}
	
	if (!flux[n])
		return false;
	
	futot += flux[n];
	nod = n;
	while (nod != 1) {
		fiu = up[nod];
		c[fiu][nod] -= flux[n];
		c[nod][fiu] += flux[n];
		nod = up[nod];
	}
	
	return true;
}

void bf1(int start) {
	int nod, fiu, p, u;
	int viz[maxn];
	memset(viz, 0, sizeof(viz));
	p = u = 1;
	q[1] = start;
	m1[1] = 1;
	viz[1] = 1;
	while (p <= u) {
		nod = q[p];
		tip[nod] = 1;
		for (i = 1; i <= n; i++)
			if (c[nod][i] > 0 && viz[i] == 0) {
				m1[i] = 1;
				viz[i] = 1;
				u++;
				q[u] = i;
			}
		p++;
	}
}

void bf2(int start) {
	int nod, fiu, p, u;
	int viz[maxn];
	memset(viz, 0, sizeof(viz));	
	p = u = 1;
	q[1] = start;
	m2[n] = 1;
	while (p <= u) {
		nod = q[p];
		tip[nod] = 2;
		for (i = 1; i <= n; i++)
			if (c[i][nod] > 0 && viz[i] == 0) {
				viz[i] = 1;
				m2[i] = 1;
				u++;
				q[u] = i;
			}
		p++;
	}
}


int main() {
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);
	
	scanf("%d%d", &n, &m);
	for (i = 1; i <= m; i++) {
		scanf("%d%d%d", &a, &b, &cc);
		mu[i].x = a; mu[i].y = b; mu[i].z = cc;
		c[a][b] = cc;
		c[b][a] = cc;
	}
	
	ok = 1;
	while (ok) {
		init();
		ok = bfs();
	}
	
	bf1(1);
	bf2(n);
	
	int nr = 0;
	
	for (i = 1; i <= m; i++) {
		int t1, t2;
		t1 = mu[i].x; t2 = mu[i].y;
		if (tip[t1] != 1) {
			int aux = t1; t1 = t2; t2 = aux;
		}
		if (tip[t1] + tip[t2] == 3 && c[t1][t2] == 0 && c[t2][t1] != 0)
			nr++;
	}
	printf("%d\n", nr);

	for (i = 1; i <= m; i++) {
		int t1, t2;
		t1 = mu[i].x; t2 = mu[i].y;
		if (tip[t1] != 1) {
			int aux = t1; t1 = t2; t2 = aux;
		}
		if (tip[t1] + tip[t2] == 3 && c[t1][t2] == 0 && c[t2][t1] != 0)
			printf("%d\n", i);
		
	}
	
	return 0;
}