Cod sursa(job #388284)

Utilizator loginLogin Iustin Anca login Data 29 ianuarie 2010 18:52:25
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
# include <fstream>
# include <iostream>
# include <algorithm>
using namespace std;
int *a[1003], c[1003][1003], I[1003][1003], t[1003], n, m, critice[1003], nc;

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;
	}
	int x, y, co;
	for (int i=1;i<=m;i++)
	{
		fin>>x>>y>>co;
		a[x][0]++;
		a[x]=(int *) realloc (a[x], (a[x][0]+1)*4);
		a[x][a[x][0]]=y;
		a[y][0]++;
		a[y]=(int *) realloc (a[y], (a[y][0]+1)*4);
		a[y][a[y][0]]=x;
		c[x][y]=co;
		c[y][x]=co;
		I[x][y]=i;
		I[y][x]=i;
	}
}

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

void EK ()
{
	int cmin;
	while (bfs (1, n))
	{
		cmin=1000000;
		for (int i=n;t[i];i=t[i])
			if (c[t[i]][i]<cmin)
				cmin=c[t[i]][i];
		for (int i=n;t[i];i=t[i])
		{
			c[t[i]][i]-=cmin;
			c[i][t[i]]-=cmin;
			
		}
	}
}

int bfs1 (int s, int d)
{
	int cc[1003], st, dr, k, tt[1003];
	st=dr=1;
	cc[st]=s;
	for (int i=1;i<=n;i++)	
		tt[i]=-1;
	tt[s]=0;
	while (st<=dr)
	{
		k=cc[st++];
		for (int i=1;i<=a[k][0];i++)
			if (c[k][a[k][i]]>0 && tt[a[k][i]]==-1)
			{
				cc[++dr]=a[k][i];
				tt[a[k][i]]=k;
			}
		if (k==d)
			return 1;
	}
	return 0;
}

void cauta (int s, int d)
{
	int cc[1003], st, dr, k;
	for (int i=1;i<=n;i++)
		t[i]=-1;
	st=dr=1;
	cc[st]=s;
	t[s]=0;
	while (st<=dr)
	{
		k=cc[st++];
		for (int i=1;i<=a[k][0];i++)
			if (t[a[k][i]]==-1)
			{
				t[a[k][i]]=k;
				if (c[k][a[k][i]]==0 && bfs1(a[k][i], n) && bfs1 (1, k))
					critice[++nc]=I[k][a[k][i]];
				if (a[k][i]!=d)
					cc[++dr]=a[k][i];
			}
	}
}

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

int main ()
{
	read ();
	EK ();
	cauta (1, n);
	write ();
	return 0;
}