Cod sursa(job #221439)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 16 noiembrie 2008 14:21:26
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstdlib>
#include <utility>
#include <algorithm>
#include <functional>

#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define C(v) memset((v),0,sizeof((v)))
#define CP(x,y) memcpy((x),(y),sizeof((y)))
#define FORit(it,v) for(it = (v).begin();it != (v).end();++it)
#define mp make_pair

#define IN  "critice.in"
#define OUT "critice.out"
#define N_MAX 1<<10

typedef vector< pair<int,int> > VI;
typedef vector< vector <int> > VM;
typedef vector<string> VS;

int S,D,N,M;
vector< vector<int> > A(N_MAX);
int T[N_MAX],C[N_MAX][N_MAX];
bool viz[N_MAX];
VI MV;

II void scan()
{
	int x,y,c;
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	
	scanf("%d%d",&N,&M);
	FOR(i,1,M)
	{
		scanf("%d%d%d\n",&x,&y,&c);
		A[x].pb(y);
		A[y].pb(x);
		C[x][y] = C[y][x] = c;
		MV.pb( mp(x,y) );
	}	
	S=1;
	D=N;
}

II void BF(int start)
{
	int stv[N_MAX];
	stv[stv[0]=1] = start;
	viz[start] = true;
	FOR(i,1,stv[0])
	{
		int nod = stv[i];
		int l = A[nod].sz() - 1;
		FOR(j,0,l)
		{
			int next = A[nod][j];
			int aux = (start==S?C[nod][next]:C[next][nod]);
			if(!viz[next] && aux)
			{
				viz[next] = true;
				T[next] = nod;
				stv[++stv[0]] = next;
			}
		}
	}	
}

II int flux()
{
	int r;
	C(viz);
	viz[S] = true;
	T[D] = 0;
	BF(S);
	if(!T[D])
		return 0;
	
	FOR(i,1,N)
	{
		if(!viz[i] || !C[i][D])
			continue;
		r = C[i][D];
		for(int j=i;j!=S && j;j = T[j])
			r = min(r, C[ T[j] ][j]);
		if(!r)
			continue;
		C[i][D] -= r;
		C[D][i] += r;
		
		for(int j=i; j!= S; j = T[j])
		{
			C[ T[j] ][j] -= r;
			C[j][ T[j] ] += r;
		}
	}	
	return 1;
}

II void solve()
{
	for(;flux(););
	vector<int> sol;
	bool vizS[N_MAX],vizD[N_MAX];
	
	BF(S);
	CP(vizS,viz);
	BF(D);
	CP(vizD,viz);
	
	FOR(i,0,M-1)
	{
		int x = MV[i].f;
		int y = MV[i].s;
		if( (vizS[x] && vizD[y] && !C[x][y]) || (vizS[y] && vizD[x] && !C[y][x]) )
			sol.pb(i+1);
	}	
	
	int l = sol.sz()-1;	
	printf("%d\n",l+1);
	FOR(i,0,l)
		printf("%d\n",sol[i]);
}

int main()
{
	scan();
	solve();
	return 0;
}