Cod sursa(job #715456)

Utilizator ELHoriaHoria Cretescu ELHoria Data 17 martie 2012 11:53:30
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <cstdlib>

using namespace std;

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

const int NMAX = 1005;

int F[NMAX][NMAX] , C[NMAX][NMAX] , T[NMAX] ,  use[NMAX] , N ,  M;
vector<int> G[NMAX] , ans;
bitset<NMAX> vis;
vector< pair<int,int> > edges;

void read_data()
{
	fin>>N>>M;
	for(int x , y , c , i = 1;i <= M;++i)
	{
		fin>>x>>y>>c;
		G[x].push_back(y);
		G[y].push_back(x);
		edges.push_back(make_pair(x,y));
		C[x][y] = C[y][x] = c;
	}
}

bool bfs()
{
	queue<int> Q;
	for(int i = 1;i <= N;++i) T[i] = -1 , vis[i] = false;
	for(Q.push(1) , vis[1] = 1;!Q.empty() && !vis[N];)
	{
		int v = Q.front(); Q.pop();
		for(vector<int>::const_iterator w = G[v].begin();w != G[v].end();++w)
			if(vis[*w] == 0 && C[v][*w] > F[v][*w])
			{
				vis[*w] = 1;
				T[*w] = v;
				Q.push(*w);
			}
	}
	return vis[N];
}

void bf_r(const int &S,const int &nr)
{
	queue<int> Q;
	for(Q.push(S) , use[S] = nr;!Q.empty();)
	{
		int v = Q.front(); Q.pop();
		for(vector<int>::const_iterator w = G[v].begin();w != G[v].end();++w)
			if(!use[*w] && C[v][*w] > abs(F[v][*w]))
			{
				use[*w] = nr;
				Q.push(*w);
			}
	}
}

void flow()
{
	for(;bfs();)
		for(vector<int>::const_iterator w = G[N].begin();w != G[N].end();++w)
		{
			if(!vis[*w] || C[*w][N] == F[*w][N]) continue;

			int fmin = int(1e9);
			for(int node = N;node != 1;node = T[node])
				fmin = min(fmin,C[T[node]][node] - F[T[node]][node]);

			if(!fmin) continue;

			for(int node = N;node != 1;node = T[node])
				F[node][T[node]]-=fmin , F[T[node]][node]+=fmin;
		}
}

int main()
{
	read_data();
	flow();
	bf_r(1,1);
	bf_r(N,2);
	for(int i = 0;i < M;++i)
		if(use[edges[i].first] + use[edges[i].second] == 3) 
			ans.push_back(i + 1);

	fout<<ans.size()<<'\n';
	for(int i = 0;i < (int)ans.size();++i)
		fout<<ans[i]<<'\n';

	return 0;
}