Cod sursa(job #430100)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 30 martie 2010 19:06:00
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
int in_Q[610],cuplaj[310],cm,dad[610],i,j,inf=1<<30,M[310][310],e,m,n,nc,dist[610],s,d,C[610][610],D[610][610],x,y;
queue<int> Q;
vector<int> v[10];
void read(),solve(),bellman_ford();

int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("cmcm.in","r",stdin);
	freopen("cmcm.out","w",stdout);
	scanf("%d%d%d",&n,&m,&e);
	for(i=1;i<=e;i++)
	{
		scanf("%d%d%d",&x,&y,&d);
		v[x].push_back(y+n);
		v[y+n].push_back(x);
		D[x][y+n]=d;D[y+n][x]=-d;
		C[x][y+n]=1;
		M[x][y]=i;
	}	
}
void solve()
{
	s=0;d=n+m+1;
	for(i=1;i<=n;i++)
	{
		v[s].push_back(i);
		C[s][i]=1;
	}
	for(i=n+1;i<=n+m;i++)
	{
		v[i].push_back(d);
		C[i][d]=1;
	}
	for(;;)
	{
		bellman_ford();
		if(dist[d]==inf)break;
		for(i=d;i;i=dad[i])
		{
			C[i][dad[i]]=1;C[dad[i]][i]=0;
			cm+=D[dad[i]][i];
			if(!dad[i])break;
			if(dad[i]<=n)cuplaj[dad[i]]=i;
		}
	}
	for(i=1;i<=n;i++)
		if(cuplaj[i])
		{
			nc++;
			cuplaj[i]-=n;
		}
	printf("%d %d\n",nc,cm);
	for(i=1;i<=n;i++)
		if(cuplaj[i])
			printf("%d ",M[i][cuplaj[i]]);
}
void bellman_ford()
{
	vector<int>::iterator I;
	queue<int> Q;
	Q.push(s);in_Q[s]=1;
	for(i=1;i<=d;i++)
	{
		dist[i]=inf;
		dad[i]=0;
	}
	while(!Q.empty())
	{
		i=Q.front();Q.pop();in_Q[i]=0;
		for(I=v[i].begin();I!=v[i].end();I++)
			if(C[i][*I]&&dist[i]+D[i][*I]<dist[*I])
			{
				dist[*I]=dist[i]+D[i][*I];
				dad[*I]=i;
				if(!in_Q[*I]){Q.push(*I);in_Q[*I]=1;dad[*I]=i;}
			}
	}
}