Cod sursa(job #523780)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 19 ianuarie 2011 11:14:27
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
// infoarena: problema/critice //
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define pp(A, B) push_back(make_pair(A, B))
using namespace std;

const int MAXN = 1010;
const int MAXM = 10010;

ifstream in("critice.in");
ofstream out("critice.out");

vector<int> g[MAXN], vn;
vector<int> sol;
deque<int> q;
vector<pair<int,int> > M;
vector<int>::iterator it;
int n,m,e[MAXM],i,j,c[MAXN][MAXN],f[MAXN][MAXN],t[MAXN],nod,x,y,z,flux,r,k;
bool r1[MAXN], r2[MAXN];

inline void prep(int nod, bool r[])
{
	r[nod] = true;
	for(vector<int>::iterator it=g[nod].begin(); it!=g[nod].end(); it++)
		if(abs(c[nod][*it]) != abs(f[nod][*it]) && !r[*it])
			prep(*it, r);
}

inline int bfs()
{
	int ret = false;
	memset(t, 0, sizeof(t[0])*n+2);
	
	deque<int> q;
	
	q.push_front(1);
	while(!q.empty())
	{
		nod = q.front();
		q.pop_front();
		
		for(it=g[nod].begin(); it!=g[nod].end(); it++)
			if(f[nod][*it] < c[nod][*it] && !t[*it])
			{
				t[*it] = nod;
				if(*it == n)
					return 1;
				q.push_back(*it);
			}
	}
	return 0;
}

int main()
{
	in>>n>>m;
	for(i=1; i<=m; i++)
	{
		in>>x>>y>>z;
		g[x].push_back(y);
		g[y].push_back(x);
		if(y == n)
			vn.push_back(x);
		c[x][y] = z;
		c[y][x] = z;
		M.pp(x, y);
	}
	
	while(bfs())
	{
		r = 1<<29;
		if(t[n] <= 0)
			continue;
		i = n;
		r = 1<<29;
		while(i!=1)
		{
			r = min(r, c[t[i]][i] - f[t[i]][i]);
			i = t[i];
		}
		
		i = n;
		while(i!=1)
		{
			f[t[i]][i] += r;
			f[i][t[i]] -= r;
			i = t[i];
		}
		flux += r;
	}
	
	prep(1, r1);
	prep(n, r2);
	
	for(i=0; i<M.size(); i++)
		if(r1[M[i].first] && r2[M[i].second] or r2[M[i].first] && r1[M[i].second])
			sol.push_back(i+1);
		
	out<<sol.size()<<'\n';
	for(i=0; i<sol.size(); i++)
		out<<sol[i]<<'\n';
	
	return 0;
}