Cod sursa(job #465029)

Utilizator ionutz32Ilie Ionut ionutz32 Data 22 iunie 2010 22:49:52
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>
#include <vector>
using namespace std;
struct nod
{
	int nr;
	nod *adr;
} *graf[1005],*u;
int n,m,i,x[10005],y[10005],z,c[1005][1005],s[1005],q[1005],st,dr,f[1005][1005],tt[1005],minim,sol;
bool k;
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[i],&y[i],&z);
		u=new nod;
		u->nr=y[i];
		u->adr=graf[x[i]];
		graf[x[i]]=u;
		u=new nod;
		u->nr=x[i];
		u->adr=graf[y[i]];
		graf[y[i]]=u;
		c[x[i]][y[i]]=z;
		c[y[i]][x[i]]=z;
	}
	k=true;
	while (k)
	{
		k=false;
		memset(s,0,sizeof(s));
		s[1]=1;
		q[1]=1;
		for (st=dr=1;st<=dr;++st)
			if (q[st]==n)
				k=true;
			else
				for (u=graf[q[st]];u;u=u->adr)
					if (!s[u->nr] && c[q[st]][u->nr]>f[q[st]][u->nr])
					{
						s[u->nr]=1;
						q[++dr]=u->nr;
						tt[u->nr]=q[st];
					}
		if (k)
			for (u=graf[n];u;u=u->adr)
				if (s[u->nr] && c[u->nr][n]>f[u->nr][n])
				{
					minim=c[u->nr][n]-f[u->nr][n];
					for (i=u->nr;i!=1;i=tt[i])
						if (c[tt[i]][i]-f[tt[i]][i]<minim)
							minim=c[tt[i]][i]-f[tt[i]][i];
					if (minim>0)
					{
						tt[n]=u->nr;
						for (i=n;i!=1;i=tt[i])
						{
							f[tt[i]][i]+=minim;
							f[i][tt[i]]-=minim;
						}
					}
				}
	}
	memset(s,0,sizeof(s));
	q[1]=1;
	s[1]=1;
	for (st=dr=1;st<=dr;++st)
		for (u=graf[q[st]];u;u=u->adr)
			if (!s[u->nr] && c[q[st]][u->nr]>f[q[st]][u->nr])
			{
				q[++dr]=u->nr;
				s[u->nr]=1;
			}
	q[1]=n;
	s[n]+=2;
	for (st=dr=1;st<=dr;++st)
		for (u=graf[q[st]];u;u=u->adr)
			if (s[u->nr]<2 && c[q[st]][u->nr]>f[q[st]][u->nr])
			{
				q[++dr]=u->nr;
				s[u->nr]+=2;
			}
	for (i=1;i<=m;++i)
		if (((s[x[i]]==1 || s[x[i]]==3) && s[y[i]]>1) || ((s[y[i]]==1 || s[y[i]]==3) && s[x[i]]>1))
			++sol;
	printf("%d\n",sol);
	for (i=1;i<=m;++i)
		if (((s[x[i]]==1 || s[x[i]]==3) && s[y[i]]>1) || ((s[y[i]]==1 || s[y[i]]==3) && s[x[i]]>1))
			printf("%d\n",i);
	return 0;
}