Cod sursa(job #318480)

Utilizator tvladTataranu Vlad tvlad Data 28 mai 2009 17:27:39
Problema Critice Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

const int N_MAX = 1000;
const int INF = 0x3f3f3f3f;

int n,m;
vector<int> G[N_MAX];
vector< pair<int,int> > muchii;
int cap[N_MAX][N_MAX], fx[N_MAX][N_MAX];
int up[N_MAX];
bool fw[N_MAX];
bool used[N_MAX], dinRad[N_MAX];

bool BF() {
	queue<int> Q;
	int cur;
	fill(used,used+n,0);
	up[0] = -1;
	used[0] = true;
	for (Q.push(0); !Q.empty(); Q.pop()) {
		cur = Q.front();
		for (vector<int>::iterator next = G[cur].begin(); next != G[cur].end(); ++next) {
			if (!used[*next] && cap[cur][*next] - fx[cur][*next] > 0) {
				Q.push(*next);
				up[*next] = cur;
				fw[*next] = true;
				if (*next == n-1)
					return true;
				else
					used[*next] = true;
			}
			if (!used[*next] && fx[*next][cur] > 0) {
				Q.push(*next);
				up[*next] = cur;
				fw[*next] = false;
				if (*next == n-1)
					return true;
				else
					used[*next] = true;
			}
		}
	}
	return false;
}

int flux() {
	int flow = 0;
	while (BF()) {
		int min = INF;
		for (int nod = n-1; nod; nod = up[nod]) {
			if (fw[nod]) {
				int muchie = cap[up[nod]][nod] - fx[up[nod]][nod];
				if (min > muchie)
					min = muchie;
			} else {
				int muchie = fx[up[nod]][nod];
				if (min > muchie)
					min = muchie;
			}
		}
		for (int nod = n-1; nod; nod = up[nod]) {
			if (fw[nod])
				fx[up[nod]][nod] += min;
			else
				fx[up[nod]][nod] -= min;
		}
		flow += min;
	}
	return flow;
}

void reach ( bool used[] ) {
	queue<int> Q;
	fill(used,used+n,false);
	for (Q.push(0), used[0] = true; !Q.empty(); Q.pop()) {
		int cur = Q.front();
		for (vector<int>::iterator next = G[cur].begin(); next != G[cur].end(); ++next) {
			if (!used[*next] && cap[cur][*next] - fx[cur][*next] > 0) {
				used[*next] = true;
				Q.push(*next);
			}
			if (!used[*next] && fx[*next][cur] > 0) {
				used[*next] = true;
				Q.push(*next);
			}
		}
	}
}

int main() {
	freopen("critice.in","rt",stdin);
	freopen("critice.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 0, a,b,c; i < m; ++i) {
		scanf("%d %d %d",&a,&b,&c);
		--a; --b;
		G[a].push_back(b);
		G[b].push_back(a);
		cap[a][b] = c;
		cap[b][a] = c;
		muchii.push_back(make_pair(a,b));
	}
	int F = flux();
//	printf("%d\n",F);

	reach(dinRad);

	vector<int> sol;
	for (int i = 0; i < m; ++i) {
		int a = muchii[i].first, b = muchii[i].second;
		if (cap[a][b] == fx[a][b] && (dinRad[a] ^ dinRad[b])) {
			sol.push_back(i+1);
		} else {
			a ^= b ^= a ^= b;
			if (cap[a][b] == fx[a][b] && (dinRad[a] ^ dinRad[b]))
				sol.push_back(i+1);
		}
	}

	printf("%d\n",sol.size());
	for (int i = 0; i < sol.size(); ++i) printf("%d\n",sol[i]);
	return 0;
}