Cod sursa(job #371916)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 7 decembrie 2009 20:31:03
Problema Cuplaj maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<stdio.h>
#include<vector>
#include<deque>
using namespace std;
int in_Q[610],cuplaj[310],cm,dad[610],i,j,oo=1<<30,M[310][310],
e,m,n,nc,dist[610],s,d,C[610][610],D[610][610],x,y;
deque<int> Q;
vector<int> v[610];
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]==oo)break;
		for(i=d;i;)
		{
			j=dad[i];C[i][j]=1;C[j][i]=0;
			cm+=D[j][i];
			if(!j)break;
			if(j<=n)cuplaj[j]=i;
			i=j;
		}
	}
	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()
{
	int DD;
	vector<int>::iterator I;
	Q.resize(0);
	Q.push_back(s);in_Q[s]=1;
	for(i=1;i<=d;i++){dist[i]=oo;dad[i]=0;}
	while(!Q.empty())
	{
		i=Q.front();Q.pop_front();in_Q[i]=0;
		for(I=v[i].begin();I!=v[i].end();I++)
			if(C[i][*I])
			{
				DD=dist[i]+D[i][*I];
				if(!in_Q[*I]){dist[*I]=DD;Q.push_back(*I);in_Q[*I]=1;dad[*I]=i;}
				else if(DD<dist[*I]){dist[*I]=DD;dad[*I]=i;}
			}
	}
}