Cod sursa(job #331333)

Utilizator cotofanaCotofana Cristian cotofana Data 13 iulie 2009 18:51:54
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#define dim 1001
#define dim2 dim*10

using namespace std;

int n, m, c[dim][dim], f[dim][dim], p[dim], used[dim], vis[dim];
vector< pair<int, int> > g[dim];
vector<int> sol;
queue<int> q;

void search(int node) {
	int i, j, in;
	vector< pair<int, int> >::iterator it;
	
	memset(used, 0, sizeof(used));
	while (q.size()) q.pop();
	q.push(node);
	used[node]=1;
	
	while (q.size()) {
		i=q.front();
		q.pop();
		
		for (it=g[i].begin(); it!=g[i].end(); ++it)
			if (!used[it->first]) {
				j=it->first;
				in=it->second;
				
				if (c[i][j]==f[i][j] || (vis[in] && c[j][i]==f[j][i]))
					if (vis[in]) sol.push_back(in);
					else vis[in]=1;
				else {
					used[j]=1;
					q.push(j);
				}
			}
	}
}

int bfs() {
	int node;
	vector< pair<int, int> >::iterator it;
	
	memset(used, 0, sizeof(used));
	while (q.size()) q.pop();
	q.push(1);
	used[1]=1;
	
	while (q.size()) {
		node=q.front();
		q.pop();
		if (node==n) continue;
		
		for (it=g[node].begin(); it!=g[node].end(); ++it)
			if (!used[it->first] && c[node][it->first]!=f[node][it->first]) {
				p[it->first]=node;
				used[it->first]=1;
				q.push(it->first);
			}
	}
	
	return used[n];
}

void flow() {
	int fm, i;
	vector< pair<int, int> >::iterator it;
	
	for (; bfs(); )
		for (it=g[n].begin(); it!=g[n].end(); ++it) {
			if (!used[it->first] || c[it->first][n]==f[it->first][n]) continue;
			
			p[n]=it->first;
			fm=1<<30;
			for (i=n; i!=1; i=p[i])
				if (c[p[i]][i]-f[p[i]][i]<fm) fm=c[p[i]][i]-f[p[i]][i];
			
			for (i=n; i!=1; i=p[i]) {
				f[p[i]][i]+=fm;
				f[i][p[i]]-=fm;
			}
		}
}

int main() {
	int i, x, y, z;
	vector<int>::iterator it;
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);
	
	scanf("%d %d\n", &n, &m);
	for (i=1; i<=m; ++i) {
		scanf("%d %d %d\n", &x, &y, &z);
		g[x].push_back(make_pair(y, i));
		g[y].push_back(make_pair(x, i));
		c[x][y]=z;
		c[y][x]=z;
	}
	
	flow();
	search(1);
	search(n);
	
	sort(sol.begin(), sol.end());
	
	printf("%d\n", sol.size());
	for (it=sol.begin(); it!=sol.end(); ++it)
		printf("%d\n", *it);
	
	return 0;
}