Cod sursa(job #409362)

Utilizator GotenAmza Catalin Goten Data 3 martie 2010 16:56:53
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.7 kb
#include<fstream.h>
#include<iostream.h>
#define u (1<<30)
int ver[129999],leg[129999],start[699],cost[129999],d[699],D,fa[699],c[699][699],rez,nr[699][699],q[4499990],L,
	h[699],hh[699],$[699][699],mod[699][699];
void bf()
{
	int i,ok=1,t;
	for(i=1;i<=D;i++)
		d[i]=u;
	d[1]=0;
	while(ok)
	{
		ok=0;
		for(i=1;i<=D;i++)
		{
			t=start[i];
			while(t)
			{
				if(c[i][ver[t]]&&d[ver[t]]>d[i]+$[i][ver[t]])
				{
					d[ver[t]]=d[i]+$[i][ver[t]];
					ok=1;
				}
				t=leg[t];
			}
		}
	}
}	
void percolate(int nod)
{
	int safe=h[nod];
	while(nod>1&&d[h[nod>>1]]>d[safe])
	{
		hh[h[nod>>1]]=nod;
		h[nod]=h[nod>>1];
		nod>>=1;
	}
	hh[safe]=nod;
	h[nod]=safe;
}
int root()
{
	int safe=h[1],son,ls,rs,nod=1;
	hh[h[L]]=1;
	h[1]=h[L--];
	do
	{
		son=0;
		ls=(nod<<1);
		rs=1+ls;
		if(ls<=L)
		{
			son=ls;
			if(rs<=L&&d[h[rs]]<d[h[ls]])
				son=rs;
			if(d[h[son]]>=d[h[nod]])
				son=0;
		}
		if(son)
		{
			hh[h[son]]=nod;
			hh[h[nod]]=son;
			ls=h[nod];
			h[nod]=h[son];
			h[son]=ls;
			nod=son;
		}
	}
	while(son);
	hh[safe]=0;
	return safe;
}
int dijkstra()
{
	int i,t,nod,temp;
	for(i=1;i<=D;i++)
	{
		t=start[i];
		while(t)
		{
			if(d[i]!=u&&d[ver[t]]!=u)
			{
				$[i][ver[t]]+=d[i]-d[ver[t]];
				mod[i][ver[t]]+=d[i]-d[ver[t]];
			}
			t=leg[t];
		}
	}
	for(i=1;i<=D;i++)
	{
		d[i]=u;
		h[i]=hh[i]=i;
		fa[i]=0;
	}
	d[1]=0;
	L=D;
	while(L)
	{
		nod=root();
		if(d[nod]==u)
			L=0;
		else
		{
			t=start[nod];
			while(t)
			{
				if(hh[ver[t]]&&c[nod][ver[t]]&&d[ver[t]]>d[nod]+$[nod][ver[t]])
				{
					d[ver[t]]=d[nod]+$[nod][ver[t]];
					fa[ver[t]]=nod;
					percolate(hh[ver[t]]);
				}
				t=leg[t];
			}
		}
	}
	if(d[D]!=u)
	{
		temp=d[D];
		i=D;
		while(i!=1)
		{
			c[fa[i]][i]--;
			c[i][fa[i]]++;
			temp-=mod[fa[i]][i];
			i=fa[i];
		}
		rez+=temp;
		return 1;
	}
	return 0;
}	
int main()
{
	int i,x,y,z,n,m,e,q=0,sol=0,j,v[1399];
	ifstream f("cmcm.in");
	ofstream g("cmcm.out");
	f>>n>>m>>e;
	for(i=1;i<=e;i++)
	{
		f>>x>>y>>z;
		x++;
		y+=n+1;		
		ver[++q]=y;
		leg[q]=start[x];
		start[x]=q;
		$[x][y]=z;
		$[y][x]=-z;
		ver[++q]=x;
		leg[q]=start[y];
		start[y]=q;
		nr[x][y]=i;
		c[x][y]=1;
	}
	for(i=2;i<=n+1;i++)
	{
		ver[++q]=i;
		leg[q]=start[1];
		start[1]=q;
		c[1][i]=1;
		ver[++q]=1;
		leg[q]=start[i];
		start[i]=q;
	}
	D=n+m+2;
	for(i=2;i<=m+1;i++)
	{
		ver[++q]=D;
		leg[q]=start[n+i];
		start[n+i]=q;
		c[n+i][D]=1;
		ver[++q]=n+i;
		leg[q]=start[D];
		start[D]=q;
	}
	bf();
	while(dijkstra());
	v[0]=0;
	for(i=2;i<=n+1;i++)
		for(j=n+2;j<D;j++)
			if(nr[i][j]&&!c[i][j])
			{
				sol++;
				v[++v[0]]=nr[i][j];
			}
	g<<sol<<' '<<rez<<'\n';
	for(i=1;i<=v[0];i++)
		g<<v[i]<<' ';
	return 0;
}