Cod sursa(job #611358)

Utilizator proflaurianPanaete Adrian proflaurian Data 1 septembrie 2011 05:53:51
Problema Cuplaj maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<stdio.h>
#include<vector>
#include<deque>
#define N 601
using namespace std;
vector<int> v[N];
deque<int> Q;
int L,R,E,P,s,d,x,y,i,Cst,e[N][N],cst[N][N],cap[N][N],q[N],p[N],c[N],T[N],oo=2000000000;
int main()
{
	freopen("cmcm.in","r",stdin);
	freopen("cmcm.out","w",stdout);
	scanf("%d%d%d",&L,&R,&E);
	for(i=1;i<=E;i++)
	{
		scanf("%d%d%d",&x,&y,&Cst);e[x][y]=i;cap[x][y+L]=1;
		cst[x][y+L]=Cst;cst[y+L][x]=-Cst;
		v[x].push_back(y+L);v[y+L].push_back(x);
	}
	for(s=0,i=1;i<=L;i++){v[s].push_back(i);cap[s][i]=1;}
	for(d=L+R+1,i=1;i<=R;i++){v[i+L].push_back(d);cap[i+L][d]=1;}
	for(Cst=0;;)
	{
		Q.resize(0);Q.push_back(s);q[s]=1;
		for(i=1;i<=L+R+1;i++){c[i]=oo;T[i]=0;}
		for(;Q.size();)
		{
		    i=Q.front();
		    for(vector<int>::iterator j=v[i].begin();j!=v[i].end();j++)
                if(cap[i][*j]&&c[*j]>c[i]+cst[i][*j])
                {
                    c[*j]=c[i]+cst[i][*j];T[*j]=i;
                    if(!q[*j]){Q.push_back(*j);q[*j]=1;}
                }
			Q.pop_front();q[i]=0;
        }
		if(c[d]==oo)break;
		for(x=d;x;x=T[x])
		{
			cap[x][T[x]]=1;cap[T[x]][x]^=1;Cst+=cst[T[x]][x];
			if(T[x]<=L)p[T[x]]=x-L;
		}
	}
	for(i=1;i<=L;i++)if(p[i])P++;
	printf("%d %d\n",P,Cst);
	for(i=1;i<=L;i++)if(p[i])printf("%d ",e[i][p[i]]);
	return 0;
}