Cod sursa(job #294755)

Utilizator znakeuJurba Andrei znakeu Data 2 aprilie 2009 19:01:26
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
using namespace std;

#include <stdio.h>
#include <vector>
#include <math.h>

struct borcan
{ int a,b; };

const int MAXN = 1024;
const int MAXK = 2147483647;


vector <int> V[MAXN];
borcan A[MAXN*10];

int C[MAXN][MAXN];
int F[MAXN][MAXN];

int cc[MAXN];
int vr[MAXN];
int vp[MAXN];
int viz[MAXN];
int RR[MAXN];

int N,M,Sc,rez=0;

inline int MIN (int a,int b)
{	if (a>b) return b;  return a; }

void getstuff()
{
	int i,X,Y,Z;
	
	scanf("%d%d",&N,&M);
	
	for (i=1; i<=M; ++i)
	{
		scanf("%d%d%d",&X,&Y,&Z);
		C[X][Y]+=Z; C[Y][X]+=Z;
		V[X].push_back(Y);	V[Y].push_back(X);
		A[i].a=X; A[i].b=Y;
	}
}

inline int bullshit()
{
	int i,j,nodC,nodK; cc[0]=1; Sc=1; viz[1]=1;
	
	for (i=2; i<=N; ++i) viz[i]=0;
	
	for (i=0; i<Sc; ++i)
	{
		nodC=cc[i];
		for (j=0; j<V[ nodC ].size(); ++j)
		{
			nodK=V[ nodC ][j];
			if ( !viz[nodK] && C[nodC][nodK]!=F[nodC][nodK])
			{
				cc[ Sc++] = nodK;				
				viz[nodK]=nodC;
			}			
		}
	}
	
	viz[1]=0;	
	return viz[N];
}

void bullshorns()
{
	int i,j, vale=0;
	
	while ( bullshit() )
		for (j=0; j<V[N].size(); ++j)
			if (F[ V[N][j] ][N] != C[ V[N][j] ][N] && viz[ V[N][j] ] )
			{
				viz[N]=V[N][j]; vale=MAXK;
				
				for (i=N; i!=1; i=viz[i])
					vale=MIN(vale,C[ viz[i] ][i] - F[ viz[i] ][i]);
				
				if (vale)
					for (i=N; i!=1; i=viz[i])
					{	
						F[viz[i]][i]+=vale;
						F[i][viz[i]]-=vale;						
					}
			}		
}

void rock()
{
	int j,i; cc[0]=1; Sc=1; vr[1]=1;
	
	for (i=0; i<Sc; ++i)
		for (j=0; j<V[ cc[i] ].size(); ++j)
			if (!vr[ V[ cc[i] ][j] ] && C[ cc[i] ][ V[cc[i]][j] ] > F[ cc[i] ][ V[cc[i]][j] ] && C[ cc[i] ][ V[cc[i]][j] ] >F[ V[cc[i]][j] ][ cc[i] ] )
			{	vr[ V[ cc[i] ][j] ]=1; cc[Sc++]= V[cc[i]][j]; }
}
void paper()
{	
	int j,i; cc[0]=N; Sc=1; vp[N]=1;
	
	for (i=0; i<Sc; ++i)
		for (j=0; j<V[ cc[i] ].size(); ++j)
			if (!vp[ V[ cc[i] ][j] ] && C[ cc[i] ][ V[cc[i]][j] ] > F[ cc[i] ][ V[cc[i]][j] ] && C[ cc[i] ][ V[cc[i]][j] ] >F[ V[cc[i]][j] ][ cc[i] ] )
			{	vp[ V[ cc[i] ][j] ]=1; cc[Sc++]= V[cc[i]][j]; }
}
void scisors()
{
	int i;
	
	for (i=1; i<=M; ++i)
		if ( (vr[ A[i].a ] && vp[ A[i].b ] ) ||  (vr[ A[i].b ] && vp[ A[i].a ] ) )
			RR[rez++]=i;
		
	printf("%d\n",rez);
	
	for (i=0; i<rez; ++i)
		printf("%d\n",RR[i]);
}

int main()
{
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	
	getstuff();
	bullshorns();
	rock();
	paper();
	scisors();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}