Cod sursa(job #221389)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 16 noiembrie 2008 13:18:20
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 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 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<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],I[N_MAX][N_MAX],C[N_MAX][N_MAX];
bool viz[N_MAX];

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;
		I[x][y] = I[y][x] = i;
	}	
	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];
			if(!viz[next] && C[nod][next])
			{
				viz[next] = true;
				T[next] = nod;
				stv[++stv[0]] = next;
			}
		}
	}	
}

II void flux()
{
	int r,flux;
	viz[D] = true;
	for(flux = 0;viz[D];)
	{
		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;
			}
			flux += r;
		}	
		C(viz);
		BF(S);
	}	
}

II void solve()
{
	int sol[N_MAX],stv[N_MAX];
	C(viz);
	sol[0] = stv[0] = 0;
	
	BF(S);
	FOR(i,1,N)
		if(viz[i] == true)
			stv[++stv[0]] = i;
	C(viz);
	BF(D);
	
	FOR(i,1,stv[0])
	FOR(j,stv[i]+1,N)
		if(viz[j] && I[stv[i]][j])
			sol[++sol[0]] = I[ stv[i] ][j];
	printf("%d\n",sol[0]);
	FOR(i,1,sol[0])
		printf("%d\n",sol[i]);
}

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