Cod sursa(job #1005666)

Utilizator otilia_sOtilia Stretcu otilia_s Data 5 octombrie 2013 14:34:57
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

const int MAXN = 1005;
const int INF = 0x3f3f3f3f;

int N,M, src, dest;
int C[MAXN][MAXN], F[MAXN][MAXN], ant[MAXN];
bool viz[MAXN][2];
vector< pair<int,int> > e;
vector<int> G[MAXN];

void read()
{
	freopen("critice.in","r",stdin);
	scanf("%d %d", &N, &M);
	for (int i = 0; i < M; ++i){
		int a, b, cap;
		scanf("%d %d %d", &a, &b, &cap);
		e.push_back(make_pair(a,b));
		C[a][b] = C[b][a] = cap;
		G[a].push_back(b);
		G[b].push_back(a);
	}
}

int BFS(){
	memset(ant, 0, sizeof(ant));
	ant[src] = src;
	
	queue<int> Q;
	Q.push(src);
	
	while (!Q.empty()){
		int x = Q.front();
		Q.pop();
		if (x == dest)
			continue;
		for (vector<int>::iterator it = G[x].begin(); it != G[x].end(); ++it) {
			if (!ant[*it] && C[x][*it] - F[x][*it] > 0) {
				ant[*it] = x;
				Q.push(*it);
			}
		}
	}
	
	return ant[dest];
}

void maxflow(){
	src = 1;
	dest = N;
	
	while(BFS()){
		for (vector<int>::iterator it = G[dest].begin(); it!=G[dest].end(); ++it) {
			if (!ant[*it] || C[*it][dest] == F[*it][dest])
				continue;
			
			ant[dest] = *it;
			int fmin = INF;
			for (int x = dest; x!=src; x = ant[x]) {
				fmin = min(fmin, C[ant[x]][x] - F[ant[x]][x]);
			}
			
			if (!fmin)
				continue;
			for (int x = dest; x!=src; x = ant[x]) {
				F[ant[x]][x] += fmin;
				F[x][ant[x]] -= fmin;
			}			
		}
	}
}

void bf(int src, int dest, int dir) 
{
	queue<int> Q;
	Q.push(src);
	viz[src][dir] = true;
	
	while (!Q.empty()) {
		int x = Q.front();
		Q.pop();
		if (x == dest)
			continue;
		for (vector<int>::iterator it = G[x].begin(); it != G[x].end(); ++it) {
			if (!viz[*it][dir] && C[x][*it] > F[x][*it] && C[*it][x] > F[*it][x]) {
				viz[*it][dir] = true;
				Q.push(*it);
			}
		}			
	}
}

void print(vector<int> sol)
{
	freopen("critice.out","w",stdout);
	printf("%d\n",sol.size());
	for (vector<int>::iterator it = sol.begin(); it!=sol.end(); ++it)
		printf("%d\n", *it);
}

int main()
{
	read();
	maxflow();
	bf(1,N,0);
	bf(N,1,1);
	
	vector<int> sol;
	for (size_t i = 0; i<e.size(); ++i) {
		int a = e[i].first;
		int b = e[i].second;

		if (F[a][b] == C[a][b] && viz[a][0] && !viz[b][0] && viz[b][1] && !viz[a][1]) {
			sol.push_back(i + 1);
			continue;
		}
		if (F[b][a] == C[b][a] && viz[b][0] && !viz[a][0] && viz[a][1] && !viz[b][1])
			sol.push_back(i + 1);
	}
	
	print(sol);
	return 0;
}