Cod sursa(job #403962)

Utilizator loginLogin Iustin Anca login Data 25 februarie 2010 16:52:14
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
# include <fstream>
# include <algorithm>
# include <iostream>
using namespace std;
struct bla{
	int c, ind;};
bla c[1024][1024];
int *a[1024], *I[1024], n, m, t[1024], crt[10024], nrc, x[10024], y[10024], nrcrit;

void add (int i, int j)
{
	a[i][0]++;
	a[i]=(int *)realloc(a[i], (a[i][0]+1)*4);
	a[i][a[i][0]]=j;
}

void read ()
{
	ifstream fin ("critice.in");
	fin>>n>>m;
	for (int i=1;i<=n;i++)
	{
		a[i]=(int *)malloc (4);
		a[i][0]=0;
	}
	for (int i=1;i<=m;i++)
	{
		int xx, yy, co;
		fin>>xx>>yy>>co;
		c[xx][yy].c=co;
		c[yy][xx].c=co;
		c[xx][yy].ind=i;
		c[yy][xx].ind=i;
		add(xx, yy);
		add(yy, xx);
		if (co==0)
			x[++nrcrit]=xx, y[nrcrit]=yy, x[++nrcrit]=yy, y[nrcrit]=xx;
	}
}

int bfs (int s, int d)
{
	for (int i=1;i<=n;i++)
		t[i]=-1;
	int co[20048], st, dr, k;
	st=dr=1;
	co[st]=s;
	t[s]=0;
	while (st<=dr)
	{
		k=co[st++];
		for (int j=1;j<=a[k][0];j++)
		{
			int i=a[k][j];
			if (c[k][i].c>0 && t[i]==-1)
			{
				t[i]=k;
				if (i==d)
					return 1;
				co[++dr]=i;
			}
		}
	}
	return 0;
}

void EK ()
{
	int cmin;
	while (bfs(1, n))
	{
		cmin=1000000000;
		for(int i=n;t[i];i=t[i])
			if (c[t[i]][i].c<cmin)
				cmin=c[t[i]][i].c;
		for (int i=n;t[i];i=t[i])
		{
			c[t[i]][i].c-=cmin;
			c[i][t[i]].c-=cmin;
			if (c[i][t[i]].c==0)
				x[++nrcrit]=t[i], y[nrcrit]=i;
		}
	}
}

void verif ()
{
	for (int i=1;i<=nrcrit;i++)
		if ((x[i]==1 || bfs(x[i], 1)) && (y[i]==n || bfs(y[i], n)))
			crt[++nrc]=c[x[i]][y[i]].ind;
}

void write ()
{	
	ofstream fout ("critice.out");
	fout<<nrc<<endl;
	sort (crt+1, crt+nrc+1);
	for (int i=1;i<=nrc;i++)
		fout<<crt[i]<<endl;
}		

int main ()
{
	read ();
	EK ();
	verif ();
	write ();
	return 0;
}