Cod sursa(job #285882)

Utilizator lolopolololopolo lolopolo Data 23 martie 2009 09:13:16
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const int INF=1<<30;
const int MMAX=10010;
const int NMAX=1010;

int a[NMAX][NMAX], flux[NMAX][NMAX], coada[NMAX*NMAX], cont[NMAX], prec[NMAX], vecini[NMAX][NMAX], n;
bool fol1[NMAX], foln[NMAX];

void flux_max(int s, int d);
void bf1();
void bfn();
int bf(int s, int d);
int minim(int a, int b);

int main()
{
	int x[MMAX], y[MMAX], i, k=0, m, sol[MMAX];
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for (i=1; i<=m; i++)
	{
		scanf("%d%d", &x[i], &y[i]);
		scanf("%d", &a[x[i]][y[i]]);
		a[y[i]][x[i]]=a[x[i]][y[i]];
		cont[x[i]]++;
		cont[y[i]]++;
	}//for i
//	for (i=1; i<=n; i++)
//	{
//		vecini[i]=new int[cont[i]+1];
//		vecini[i][0]=0;
//	}//for i
	for (i=1; i<=m; i++)
	{
		vecini[x[i]][++vecini[x[i]][0]]=y[i];
		vecini[y[i]][++vecini[y[i]][0]]=x[i];
	}//for i
	flux_max(1, n);
	bf1();
	bfn();
  for (i=1; i<=m; i++)
		if ((fol1[x[i]]&&foln[y[i]])||(fol1[y[i]]&&foln[x[i]]))
			sol[k++]=i;
	printf("%d\n", k);
	for (i=0; i<k; i++)
		printf("%d\n", sol[i]);
	return 0;
}//main

void flux_max(int s, int d)
{
	int min, i;
	while (bf(s, d))
	{
		min=INF;
		i=d;
		while (i!=s)
		{
			min=minim(min, a[prec[i]][i]-flux[prec[i]][i]);
			i=prec[i];
		}//while
		i=d;
		while (i!=s)
		{
			flux[prec[i]][i]+=min;
			flux[i][prec[i]]-=min;
			i=prec[i];
		}//while
	}//while
}//flux_max

int bf(int s, int d)
{
	int p=0, u=0, t, i, j;
	memset(prec, -1, sizeof(prec));
	coada[u]=s;
	prec[s]=-2;
	if (s==d)
		return 1;
	while (p<=u)
	{
		t=coada[p++];
		for (i=1; i<=vecini[t][0]; i++)
		{
			j=vecini[t][i];
			if ((prec[j]==-1)&&(a[t][j]>flux[t][j]))
			{
				coada[++u]=j;
				prec[j]=t;
				if (j==d)
					return 1;
			}//if
		}//for i
	}//while
	return 0;
}//bf

void bf1()
{
	int p=0, u=0, t, i, j;
	coada[u]=1;
	fol1[1]=1;
	while (p<=u)
	{
		t=coada[p++];
		for (i=1; i<=vecini[t][0]; i++)
		{
			j=vecini[t][i];
			if ((!fol1[j])&&(a[t][j]>abs(flux[t][j])))
			{
				coada[++u]=j;
				fol1[j]=1;
			}//if
		}//for i
	}//while
}//bf1

void bfn()
{
	int p=0, u=0, t, i, j;
	coada[u]=n;
	foln[n]=1;
	while (p<=u)
	{
		t=coada[p++];
		for (i=1; i<=vecini[t][0]; i++)
		{
			j=vecini[t][i];
			if ((!foln[j])&&(a[t][j]>abs(flux[t][j])))
			{
				coada[++u]=j;
				foln[j]=1;
			}//if
		}//for i
	}//while
}//bfn

int minim(int a, int b)
{
	if (a<b)
		return a;
	else
		return b;
}//minim