Cod sursa(job #175049)

Utilizator razvi9Jurca Razvan razvi9 Data 9 aprilie 2008 15:39:32
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<cstdio>
#include<vector>
int n,m,T[1001],c[1001][1001],x,y,cst,l[1001],i,j,lm[10001][2];
std::vector<int> a[1001];
int bf()
{
	int st=0,dr=0,vf;
	memset(T,0,sizeof(T));
	l[st]=1;
	T[1]=1;
	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]]=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]-=n;
				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;
}