Cod sursa(job #296000)

Utilizator znakeuJurba Andrei znakeu Data 3 aprilie 2009 22:15:32
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <stdio.h>

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

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

int V[MAXN][MAXN];
int A[MAXM][2];

int viz[MAXN];
int ce[MAXN];

int PP[MAXN];
int SS[MAXN];
int RR[MAXN];

int N,M,cc,rez;

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

inline int WTF(int a)
{ if (a>-a) return a; return -a;}

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

inline int ciuperca()
{
	int i,j,nodC,nodK;
	
	ce[0]=1; cc=1; viz[1]=-1; 
	for (i=2; i<=N && i<MAXN; ++i) viz[i]=0;
	
	for (i=0; i<cc && i<MAXN; ++i)
	{
		nodC=ce[i];
		if (nodC!=N)
			for (j=1; j<=V[ nodC ][0] && j<MAXN; ++j)
			{
				nodK=V[nodC][j];
				if (F[nodC][nodK]!=C[nodC][nodK]  && !viz[nodK])
				{	viz[nodK]=nodC;	ce[ cc++ ]=nodK;	}
			}				
	}
	return viz[N];
}

inline void rock()
{
	int munte=0,vale,j,i;
	
	while (ciuperca())
	{
		for (j=1; j<= V[N][0] && j<MAXN; ++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<MAXN; i=viz[i])
					vale=MIN(vale,C[ viz[i] ][i] - F[viz[i]][i]);
				
				if (vale)
					for (i=N; i>1 && i<MAXN; i=viz[i])
					{	
						F[viz[i]][i]+=vale;
						F[i][viz[i]]-=vale;						
					}
				
				munte+=vale;				
			}
	}
}



inline void paper()
{
	int i,j,nodC=0,nodK=0; cc=1; ce[0]=1; PP[1]=1;
	
	for (i=0; i<cc && i<MAXN; ++i)
	{
		nodC=ce[i];
		for (j=1; j<=V[nodC][0] && j<MAXN; ++j)
		{
			nodK=V[nodC][j];
			if (!PP[ nodK ] && C[ nodC ][ nodK ] > F[ nodC ][ nodK ] && C[ nodC ][ nodK ] >F[ nodK ][ nodC ] )
			{	ce[cc++]=nodK; PP[ nodK ] = 1; }				
		}			
	}
}

inline void scisors()
{
	int i,j,nodC=0,nodK=0; cc=1; ce[0]=N; SS[N]=1;
	
	for (i=0; i<cc && i<MAXN; ++i)
	{
		nodC=ce[i];
		for (j=1; j<=V[ nodC ][0] && j<MAXN; ++j)
		{
			nodK=V[nodC][j];
			if (!SS[ nodK ] && C[ nodC ][ nodK ] > F[ nodC ][ nodK ] && C[ nodC ][ nodK ] >F[ nodK ][ nodC ] )
			{	ce[cc++]=nodK; SS[ nodK ] = 1; }					
		}
	}
	
}

inline void mushroom()
{
	int i;
	
	for (i=1; i<=M  && i<=MAXM; ++i)
	{
		if ( ( PP[ A[i][0] ] && SS[ A[i][1] ] ) || ( PP[ A[i][1] ] && SS[ A[i][0] ] ) )
			RR[rez++]=i;
	}
	
	printf("%d\n",rez);
	for (i=0; i<rez && i<=MAXM; ++i)
		printf("%d\n",RR[i]);
}

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