Cod sursa(job #221416)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 16 noiembrie 2008 14:04:58
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 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 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[0] = 1;
	stv[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];
			if(!viz[next] && C[nod][next])
			{
				viz[next] = true;
				T[next] = nod;
				stv[++stv[0]] = next;
			}
		}
	}	
}

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

II void solve()
{
	for(;flux(););
	int sol[N_MAX],stv[N_MAX];
	bool vizS[N_MAX],vizD[N_MAX];
	sol[0] = 0;
	C(vizS),C(vizD);
	
	stv[0] = 1;
	stv[1] = S;
	vizS[S] = 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];
			if(!vizS[next] && C[nod][next])
				vizS[next] = true,
				stv[++stv[0]] = next;
		}
	}	
	
	stv[0] = 1;
	stv[1] = D;
	vizD[D] = 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];
			if(!vizD[next] && C[next][nod])
				vizD[next] = true,
				stv[++stv[0]] = next;
		}
	}	
	
	FOR(i,0,M-1)
		if( (vizS[ MV[i].f ] && vizD[ MV[i].s] && !C[ MV[i].f ][ MV[i].s ]) || (vizS[ MV[i].s ] && vizD[ MV[i].f ] && !C[ MV[i].s ][ MV[i].f ]) )
			sol[++sol[0]] = i+1;
	
	printf("%d\n",sol[0]);
	FOR(i,1,sol[0])
		printf("%d\n",sol[i]);
}

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