Cod sursa(job #221799)

Utilizator ilincaSorescu Ilinca ilinca Data 18 noiembrie 2008 02:27:42
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>
#include <string.h>

#define nmax 1005
#define mmax 10005
#define inf 1<<30
#define pr(x) fprintf(stderr,#x" = %d\n",x)

struct muchie
{
	int a, b;
};

int n, m, f [nmax] [nmax], prev [nmax], q [nmax*nmax], cr [mmax], a [nmax] [nmax];
muchie w [mmax];
int c [nmax] [nmax];
char v1 [nmax], v2 [nmax];


inline int abs (int x)
{
	if (x > 0)
		return x;
	return -x;
}

void scan ()
{
	int i, z;
	scanf ("%d%d", &n, &m);
	for (i=1; i<=m; ++i)
	{
		scanf ("%d%d%d", &w [i].a, &w [i].b, &z);
		a [w [i].a] [w [i].b]=a [w [i].b] [w [i].a]=z;
		c [w [i].a] [++c [w [i].a] [0]]=w [i].b;
		c [w [i].b] [++c [w [i].b] [0]]=w [i].a;
	}
}

int bf ()
{
	int i, p, u, j;
	char viz [nmax];
	memset(viz,0,sizeof(viz));
	p=u=1;
	q [p]=1;
	viz [1]=1;
	while (p <= u)
	{
		for (i=1; i<=c [p [q]] [0]; ++i)
		{
			j=c [q [p]] [i];
			if (a [q [p]] [j] > f [q [p]] [j] && !viz [j])
			{
				q [++u]=j;
				viz [j]=1;
				prev [j]=q [p];
				if (j == n)
					return 1;
			}
		}
		++p;
	}
	return 0;
}

void flux ()
{
	int min, p, x;
	while (bf ())
	{
		min=inf;
		p=n;
		while (p > 1)
		{
			x=a [prev [p]] [p] - f [prev [p]] [p];
			if (x < min)
				min=x;
			p=prev [p];
		}
		p=n;
		while (p > 1)
		{
			f [prev [p]] [p]+=min;
			f [p] [prev [p]]-=min;
			p=prev [p];
		}
	}
}

void bf2 (int s, char v [])
{
	int i, p, u, j;
	p=u=1;
	q [p]=s;
	v [s]=1;
	while (p <= u)
	{
		for (i=1; i<=c [q [p]] [0]; ++i)
		{
			j=c [q [p]] [i];
			if (!v [j] && a [q [p]] [j] > abs (f [q [p]] [j]))
			{
				q [++u]=j;
				v [j]=1;
			}
		}
		++p;
	}
}

void rez ()
{
	int i;
	flux ();
	bf2 (1, v1);
	bf2 (n, v2);
	for (i=1; i<=m; ++i)
		if ((v1 [w [i].a] && v2 [w [i].b] ) || (v1 [w [i].b] && v2 [w [i].a]))
			cr [++cr [0]]=i;
}

void print ()
{
	int i;
	for (i=0; i<=cr [0]; ++i)
		printf ("%d\n", cr [i]);
}

int main ()
{
	freopen ("critice.in", "r", stdin);
	freopen ("critice.out", "w", stdout);
	scan ();
	rez ();
	print ();
	return 0;
}