Cod sursa(job #168361)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 31 martie 2008 08:18:03
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define inf 0x3f3f3f3f
#define MAX_N 1010
#define pb push_back
#define d(x,y) (C[x][y]-F[x][y])
#define b begin()
#define e end()
typedef vector<int> vi;

vi G[MAX_N], L;
int Nr[MAX_N][MAX_N];
int C[MAX_N][MAX_N], F[MAX_N][MAX_N];
int T[MAX_N];
int n, nr;

int bfs(int s, int d) {
	queue<int> Q;
	vi::iterator i;

	memset(T, 0, sizeof(T));
	Q.push(s);
	while ( !Q.empty() ) {
		int x = Q.front(); Q.pop();
		for (i=G[x].b; i!=G[x].e; ++i)
			if ( d(x,*i) && !T[*i] ) {
				T[*i] = x; Q.push(*i);
			}
	}
	return T[n] != 0;
}

void flux() {
	int r, f, c, fin, i;
	for (f=0; bfs(1,n); f += r)
		for (fin=1; fin<=n; ++fin) {
			if ( C[fin][n] <= F[fin][n] )
				continue;
			for (c=-1, r=inf, i=fin; i!=1; i=T[i])
				if ( r > d(T[i],i) )
					r = d(T[i],i), c=Nr[T[i]][i];
			for (i=fin; i!=1; i=T[i])
				F[T[i]][i] += r, F[i][T[i]] -= r;
			L.pb(c);
	}
}

void read_data();
void write_data();
int main() {
	read_data();
	flux();
	write_data();
	return 0;
}

void read_data() {
	int m;
	freopen("critice.in", "r", stdin);
	scanf("%d %d", &n, &m);
	while ( m-- ) {
		int x, y, c;
		scanf("%d %d %d", &x, &y, &c);
		G[x].pb(y);
		G[y].pb(x);
		C[x][y] = C[y][x] = c;
		Nr[x][y] = Nr[y][x] = ++nr;
	}
}

void write_data() {
	vi::iterator i;

	freopen("critice.out", "w", stdout);
	printf("%d\n", L.size());
	for (i=L.b; i!=L.e; ++i)
		printf("%d\n", *i);
}