Cod sursa(job #678661)

Utilizator c_adelinaCristescu Adelina c_adelina Data 12 februarie 2012 10:38:32
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define pb push_back
#include <cstring>
using namespace std;
int poz[1009][1009],list[1009],n,tt[1009],viz[1009],C[1009][1009],F[1009][1009];
vector <int> v[1009];

int bf()
{
	int nr=1,i=1,nod;
	list[1]=1;viz[1]=1;
	memset(viz,0,sizeof(viz));
	for (;i<=nr;++i)
	{
		nod=list[i];
		for (vector <int>::iterator it=v[nod].begin();it!=v[nod].end();++it)
			if ((!viz[*it]) && (C[nod][*it]!=F[nod][*it]))
				{tt[*it]=nod,viz[*it]=1;
			     if (*it!=n) list[++nr]=*it;
				}
	}
return viz[n];
}
		
			
	
	

int main()
{
	int m,i,j,x,y,z;
	
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %d",&x,&y,&z);
		C[x][y]=z;C[y][x]=z;
		poz[x][y]=poz[y][x]=i;
		v[x].pb(y),v[y].pb(x);
	}
	while (bf())
	
		for (vector <int>::iterator it=v[n].begin();it!=v[n].end();++it)
			if ((viz[*it]) && (C[*it][n]!=F[*it][n]))
			{
				tt[n]=*it;
				int nod=n,mn=100099;
				for (;nod!=1;nod=tt[nod])
					if (C[tt[nod]][nod]-F[tt[nod]][nod]<mn)
						mn=C[tt[nod]][nod]-F[tt[nod]][nod];
				for (nod=n;nod!=1;nod=tt[nod])
					F[tt[nod]][nod]+=mn,F[nod][tt[nod]]-=mn;
			}
			
			
/*for (i=1;i<=n;++i)
	for (int j=i+1;j<=n;++j)
		if ((C[i][j]==F[i][j]) && (poz[i][j]))
			printf("%d ",poz[i][j]);*/
memset(viz,0,sizeof(viz));
m=list[1]=1;viz[1]=1;
for (i=1;i<=m;++i)
{
	j=list[i];
	for (vector <int>::iterator it=v[j].begin();it!=v[j].end();++it)
		if ((C[j][*it]!=F[j][*it]) && (!viz[*it]))
		{viz[*it]=1;if (*it!=n) list[++m]=*it;
		}
}
m=1;list[1]=n;
memset(tt,0,sizeof(tt));
tt[n]=1;x=0;
for (i=1;i<=m;++i)
{
	j=list[i];
	for (vector<int>::iterator it=v[j].begin();it!=v[j].end();++it)
		if ((C[*it][j]!=F[*it][j]) && (!tt[*it]))
		{tt[*it]=1;
		 if (*it!=1) list[++m]=*it;
		} else
			if ((C[*it][j]==F[*it][j]) && (viz[*it]))
				 C[0][++x]=poz[*it][j];
}
sort(C[0]+1,C[0]+x+1);
printf("%d\n",x);
for (i=1;i<=x;++i)
	printf("%d\n",C[0][i]);

			

	
		
	
return 0;
}