Cod sursa(job #221780)

Utilizator ilincaSorescu Ilinca ilinca Data 17 noiembrie 2008 22:20:30
Problema Critice Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>
#include <string.h>

#define nmax 1055
#define mmax 10055
#define inf 300000
#define pr(x) fprintf(stderr,#x" = %d\n",x)

struct muchie
{
	int a, b;
};

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



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);
		c [w [i].a] [w [i].b]=c [w [i].b] [w [i].a]=z;
	}
}

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

void flux ()
{
	int min, p, x;	
	while (bf ())
	{
		min=inf;
		p=n;
		while (p != 1)
		{
			x=c [prev [p]] [p] - abs (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;
	p=u=1;
	q [p]=s;
	v [s]=1;
	while (p <= u)
	{
		for (i=1; i<=n; ++i)
			if (!v [i] && c [q [p]] [i] > abs (f [q [p]] [i]))
			{
				q [++u]=i;
				v [i]=1;
			}
		++p;
	}
}

void rez ()
{
	char v1 [nmax], v2 [nmax];
	int i;
	flux ();
	memset (v1, 0, sizeof (v1));
	memset (v2, 0, sizeof (v2));
	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;
}