Cod sursa(job #419559)

Utilizator MikeysMihai Tiganus Mikeys Data 17 martie 2010 18:14:38
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream.h>

int n,m,A[1001][1001],C[1001][1001],F[1001][1001],viz[1001],viz_crit[1001],muchii[2][10000];

void citire()
{
	ifstream in("critice.in");
	in >>n>>m;
	int i,x,y,c;
	for(i=1;i<=n;i++) A[i][0]=0;
	for(i=1;i<=m;i++)
	{
		in >>x>>y>>c;
		muchii[0][i]=x;
		muchii[1][i]=y;
		A[x][0]++;
		A[x][A[x][0]]=y;
		A[y][0]++;
		A[y][A[y][0]]=x;
		F[x][y]=F[y][x]=0;
		C[x][y]=C[y][x]=c;
	}
	in.close();
}

int bf(int S,int D)
{
	int q[1001],i,inc=0,sf=-1,tmp;

	memset(viz,0,sizeof(viz));
	q[++sf]=S;
	viz[S]=-1;
	while(inc<=sf)
	{
		tmp=q[inc++];
		for(i=1;i<=A[tmp][0];i++)
			if(C[tmp][A[tmp][i]]>F[tmp][A[tmp][i]] && !viz[A[tmp][i]])
			{
				q[++sf]=A[tmp][i],viz[A[tmp][i]]=tmp;
				if(A[tmp][i]==D) return 1;
			}
	}
	return 0;
}

void ek()
{
	int i,min,flux=0;
	while(bf(1,n))
	{
		//cout <<"bf-ul zburda!\n";
		min=C[n][viz[n]]-F[n][viz[n]];
		i=viz[n];
		while(viz[i]!=-1) 
		{
			if(min>C[i][viz[i]]-F[i][viz[i]]) min=C[i][viz[i]]-F[i][viz[i]];
			i=viz[i];
		}
		i=n;
		while(viz[i]!=-1)
		{
			F[i][viz[i]]+=min;
			F[viz[i]][i]+=min;
			i=viz[i];
		}
		flux+=min;
	}
	//return flux;
}

void bf_critice(int S,int k)
{
	int i,q[1001],inc=0,sf=-1,tmp;
	viz_crit[S]=k;
	q[++sf]=S;
	while(inc<=sf)
	{
		tmp=q[inc++];
		for(i=1;i<=A[tmp][0];i++)
			if(!viz_crit[A[tmp][i]] && C[tmp][A[tmp][i]]>F[tmp][A[tmp][i]]) 
			{
				viz_crit[A[tmp][i]]=k;
				q[++sf]=A[tmp][i];
			}
	}
}

int main()
{
	ofstream out("critice.out");
	int i,K=0;
	citire();
	ek();
	memset(viz_crit,0,sizeof(viz_crit));
	bf_critice(1,1);
	bf_critice(n,2);
	for(i=1;i<=m;i++)
		if(viz_crit[muchii[0][i]]+viz_crit[muchii[1][i]]==3) K++;
	out <<K<<"\n";
	for(i=1;i<=m;i++)
		if(viz_crit[muchii[0][i]]+viz_crit[muchii[1][i]]==3) out <<i<<"\n";
	out.close();
	return 0;
}