Cod sursa(job #293544)

Utilizator znakeuJurba Andrei znakeu Data 1 aprilie 2009 21:44:54
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <stdio.h>

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

struct borcan
{	int a,b;	};

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

int *V[MAXN];
borcan A[20*MAXN];
int No[MAXN];

int vizit[MAXN];
int ce[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 MAX(int a, int b)
{ if (a>b) return a; return b;}

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=0; i<M; ++i)
	{
		scanf("%d%d%d",&X,&Y,&Z);
		C[X][Y]+=Z;
		C[Y][X]+=Z;
		A[2*i].a=X; A[2*i].b=Y;	No[X]++;
		A[2*i+1].a=Y; A[2*i+1].b=X; No[Y]++;
		
	}
	
	for (i=1; i<=N; ++i)
	{	V[i]=new int [ No[i] +2 ]; V[i][0]=0; }

	for (i=0,Z=2*M; i<Z; ++i)
		V[ A[i].a ][ ++V[A[i].a][0] ]=A[i].b;
}

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


inline void rock()
{
	int munte=0,vale,j,i;
	
	while (ciuperca())
		for (j=1; j<= V[N][0]; ++j)
			if ( F[ V[N][j] ][N]!=C[ V[N][j] ][N] && vizit[ V[N][j] ])
			{
				cE[N] = V[N][j]; vale=MAXK;
				
				for (i=N; i!=1; i=cE[i])
					vale=MIN(vale,C[ cE[i] ][i] - F[cE[i]][i]);
				
				if (vale)
					for (i=N; i!=1; i=cE[i])
					{	
						F[cE[i]][i]+=vale;
						F[i][cE[i]]-=vale;						
					}
				
				munte+=vale;				
			}
}



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

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

inline void mushroom()
{
	int i,k=M*2;
	
	for (i=0; i<k; i+=2)
	{
		if ( ( PP[ A[i].a ] && SS[ A[i].b ] ) || ( PP[ A[i].b ] && SS[ A[i].a ] ) )
			RR[rez++]=i/2+1;		
	}
	
	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();
	rock();
	paper();
	scisors();
	mushroom();
	
	fclose(stdin );
	fclose(stdout);
	return 0;
}