Cod sursa(job #388286)

Utilizator loginLogin Iustin Anca login Data 29 ianuarie 2010 18:56:00
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 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;
			
		}
	}
}
void cauta (int s, int d)
{
	for (int i=1;i<=n;i++)
		for (int j=1;j<=a[i][0];j++)
			if (c[i][a[i][j]]==0)
				if (bfs(1, i) && bfs(a[i][j], n))
					critice[++nc]=I[i][a[i][j]];
}

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;
}