Cod sursa(job #175056)

Utilizator razvi9Jurca Razvan razvi9 Data 9 aprilie 2008 15:47:02
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<cstdio>
#include<vector>
const int noduri=1100;
const int muchii=11000;
int n,m,T[noduri],c[noduri][noduri],x,y,cst,l[noduri],i,j,lm[muchii][2];
std::vector<int> a[noduri];
int bf()
{
	int st=0,dr=0,vf;
	memset(T,0,sizeof(T));
	l[0]=1;T[1]=1;
	while(st<=dr)
	{
		vf=l[st];
		if(vf!=n)
		for(i=0;i<a[vf].size();i++)
			if(c[vf][a[vf][i]] && !T[a[vf][i]])
			{
				T[a[vf][i]]=vf;
				l[++dr]=a[vf][i];
			}
		st++;
	}
	return T[n];
}
inline void flux()
{
	int r;
	while(bf())
		for(i=1;i<n;i++)
			if(c[i][n]>0)
			{
				r=c[i][n];
				for(j=i;j!=1 && r;j=T[j])
					if(r>c[j][T[j]]) r=c[j][T[j]];
				if(!r) continue;
				c[i][n]-=r;
				c[n][i]-=r;
				for(j=i;j!=1;j=T[j])
				{
					c[j][T[j]]-=r;
					c[T[j]][j]-=r;
				}
			}
}
inline void bf2(int vf,int parte)
{
	int st=0,dr=0;
	l[0]=vf;
	T[vf]=parte;
	while(st<=dr)
	{
		vf=l[st];
		for(i=0;i<a[vf].size();i++)
			if(c[vf][a[vf][i]] && !T[a[vf][i]])
			{
				T[a[vf][i]]=parte;
				l[++dr]=a[vf][i];
			}
		st++;
	}
}
inline void solve()
{
	memset(T,0,sizeof(T));
	bf2(1,1);
	bf2(n,2);
	int st=0;
	for(i=1;i<=m;i++)
		if(!c[lm[i][0]][lm[i][1]] && T[lm[i][1]] && T[lm[i][0]] && T[lm[i][0]]!=T[lm[i][1]])
			l[++st]=i;
	printf("%d\n",st);
	for(i=1;i<=st;i++)
		printf("%d\n",l[i]);
}
int main()
{
	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,&cst);
		a[x].push_back(y);
		a[y].push_back(x);
		c[x][y]=c[y][x]=cst;
		lm[i][0]=x;lm[i][1]=y;
	}
	flux();
	solve();
	fclose(stdout);
	return 0;
}