Cod sursa(job #476789)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 12 august 2010 13:10:52
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define Nmax 305*2
#define pb push_back
#define INF 2147000000

using namespace std;

vector< int > v[Nmax];
queue< int > Q;
int C[Nmax][Nmax],Cost[Nmax][Nmax],F[Nmax][Nmax],M[Nmax][Nmax];
int dist[Nmax],prev[Nmax],inq[Nmax];
int n,m,much,nrm,rez,S,D,ok;
int vm[Nmax];

void bellman(){
	vector< int >::iterator it;
	int i,f;
	for(i=1;i<=n+m+1;++i) dist[i]=INF;
	Q.push(S);
	
	while( !Q.empty() ){
		f=Q.front(); Q.pop();
		inq[f]=0;
		
		for(it=v[f].begin(); it!=v[f].end(); ++it)
			if( C[f][*it] > F[f][*it] && dist[*it] > dist[f] + Cost[f][*it] ){
				dist[*it] = dist[f] + Cost[f][*it];
				prev[*it]=f;
				if( ! inq[*it] ){
					inq[*it]=1;
					Q.push(*it);
				}
			}
	}
	
	if( dist[D] == INF ) return;
	
	for(i=D; i!=S; i=prev[i]){
		F[prev[i]][i]++;
		F[i][prev[i]]--;
	}
	ok=1;
	rez += dist[D];
}

int main(){
	int i,j,x,y,z;
	freopen("cmcm.in","r",stdin);
	freopen("cmcm.out","w",stdout);
	scanf("%d%d%d",&n,&m,&much);
	for(i=1;i<=much;++i){
		scanf("%d%d%d",&x,&y,&z);
		C[x][y+n]=1;
		Cost[x][y+n]=z; Cost[y+n][x]=-z;
		v[x].pb(y+n);
		v[y+n].pb(x);
		M[x][y+n]=i; M[y+n][x]=i;
	}
	
	S=0; D=n+m+1;
	for(i=1;i<=n;++i) C[S][i]=1, v[S].pb(i);
	for(i=1;i<=m;++i) C[i+n][D]=1, v[i+n].pb(D);
	
	for(ok=1; ok; ){
		ok=0;
		bellman();
	}
	
	for(i=1;i<=n;++i)
		for(j=n+1; j<=n+m; ++j)
			if( F[i][j] ) vm[++nrm]=M[i][j];

	printf("%d %d\n",nrm,rez);
	for(i=1;i<=nrm;++i) printf("%d ",vm[i]);
	printf("\n");
	fclose(stdin); fclose(stdout);
	return 0;
}