Cod sursa(job #183947)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 22 aprilie 2008 19:47:35
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio>
#include <vector>
#include <string>

using namespace std;

#define pb push_back
#define sz(c) (int)((c).size())
#define f first
#define s second
#define mp make_pair

#define fin  "critice.in"
#define fout "critice.out"

const int Nmax = 1024;
const int Max  = 10020;

int N,M;
int C[Nmax][Nmax],F[Nmax][Nmax];

int tat[Nmax];
char viz1[Nmax],viz2[Nmax];
int q[Nmax];

vector <int> g[Nmax];
vector <pair<int,int> > muchie;

void readdata()
{
	int i,x,y,c;

	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);

	scanf("%d%d",&N,&M);

	for ( i = 1; i <= M; ++i )
	{
		scanf("%d%d%d",&x,&y,&c);
		g[x].pb(y);
		g[y].pb(x);
		C[x][y] = C[y][x] = c;
		muchie.pb(mp(x,y));
	}
}

int bfs()
{
	int i,x,st;

	memset(tat,0,sizeof(tat));

	tat[1] = 1;
	q[1] = q[0] = 1;

	for ( st = 1; st <= q[0]; ++st )
	{
		x = q[st];
		for ( i = 0; i < sz(g[x]); ++i )
		       if ( tat[ g[x][i] ] == 0 && C[ x ][ g[x][i] ] > F[ x ][ g[x][i] ] )
			       tat[ g[x][i] ] = x, q[ ++q[0] ] = g[x][i];
		if ( tat[N] ) return 1;
	}

	return 0;
}

inline int absf(int a) { return a < 0 ? ( a * -1 ) : a; }

void bf(int start,char viz[])
{
	int i,x,st,cost;

	memset(viz,0,sizeof(viz));
	q[0] = 1; q[1] = start;

	viz[start] = 1;

	for ( st = 1; st <= q[0]; ++st )
	{
		x = q[st];
		for ( i = 0; i < sz(g[x]); ++i )
			if ( !viz[ g[x][i] ] && absf(F[ x ][ g[x][i] ]) < C[ x ][ g[x][i] ] )
					viz[ g[x][i] ] = 1, q[ ++q[0] ] = g[x][i];
	}
}

void flux()
{
	int x,add = 0;
	
	while ( bfs() )
	{
		add = Max;

		x = N;
		while ( x != 1 )
			add = min(add,C[tat[x]][x]-F[tat[x]][x]), x = tat[x];
		x = N;
		while ( x != 1 )
			F[tat[x]][x] += add, F[x][tat[x]] -= add, x = tat[x];
	}

#ifdef DBG
	int i,j;
	for ( i = 1; i <= N; ++i, printf("\n") )
	{
		printf("%d: ",i);
		for ( j = 0; j < sz(g[i]); ++j )
			printf("%d|%d ",g[i][j],F[i][g[i][j]]);
	}
#endif
}

void solve()
{
	int i,cnt = 0;

	bf(1,viz1);
	bf(N,viz2);

	for ( i = 0; i < M; ++i )
		if ( viz1[ muchie[i].f ] && viz2[ muchie[i].s ] || viz1[ muchie[i].s ] && viz2[ muchie[i].f ] )
			++cnt;
	printf("%d\n",cnt);
	for ( i = 0; i < M; ++i )
		if ( viz1[ muchie[i].f ] && viz2[ muchie[i].s ] || viz1[ muchie[i].s ] && viz2[ muchie[i].f ] )
			printf("%d\n",i+1);
}

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