Cod sursa(job #168366)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 31 martie 2008 09:42:33
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <set>
using namespace std;
#define inf 0x3f3f3f3f
#define MAX_N 1010
#define pb push_back
#define f first
#define s second
#define mp make_pair
#define d(x,y) (C[x][y]-F[x][y])
#define b begin()
#define e end()
#define exista(a,b) (a.find(b)!=a.e)
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef set<int> si;

vi G[MAX_N];
vii edge;
int Nr[MAX_N][MAX_N];
int C[MAX_N][MAX_N], F[MAX_N][MAX_N];
int T[MAX_N];
int n, nr;
si L, R;

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, fin, i, rr;
	for (f=0; bfs(1,n); f += rr)
		for (rr=0, fin=1; fin<=n; ++fin) {
			if ( C[fin][n] <= F[fin][n] )
				continue;
			for (r=d(fin,n), i=fin; i!=1; i=T[i])
            	r = min(r, d(T[i],i));
			for (i=fin; i!=1; i=T[i])
				F[T[i]][i] += r, F[i][T[i]] -= r;
            F[fin][n] += r, F[n][fin] -= r;
            rr += r;
	}
}

void BF1(int start, si &S) {
	vi::iterator i;

	S.clear();
	queue<int> Q;
	memset(T, 0, sizeof(T));
	Q.push(start);
    S.insert(start);
	while ( !Q.empty() ) {
		int x = Q.front(); Q.pop();
		for (i=G[x].b; i!=G[x].e; ++i)
			if ( !T[*i] && d(x,*i) ) {
				S.insert(*i);
				T[*i] = x; Q.push(*i);
			}
	}
}

void read_data();
void write_data();
int main() {
	read_data();
	flux();
	BF1(1, L);
	BF1(n, R);
	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;
		edge.pb(mp(x,y));
	}
}

void write_data() {
	vii :: iterator i;

	freopen("critice.out", "w", stdout);
	nr = 0;
	for (i=edge.b; i!=edge.e; ++i) {
		int x=i->f, y=i->s;
		if ( (exista(L,x) && exista(R,y)) || (exista(L,y) && exista(R,x)) )
			nr ++;
	}
	printf("%d\n", nr);
	for (i=edge.b; i!=edge.e; ++i) {
		int x=i->f, y=i->s;
		if ( (exista(L,x) && exista(R,y)) || (exista(L,y) && exista(R,x)) )
			printf("%d\n", Nr[x][y]);
	}
}