Cod sursa(job #604255)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 21 iulie 2011 13:29:10
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<string>

#define INF 0x3f3f3f3f
#define maxN 711
#define dif 300
#define S 705
#define D 709
#define Emax 50005

using namespace std;

FILE*f=fopen("cmcm.in","r");
FILE*g=fopen("cmcm.out","w");

int n,m,edge,i,x,y,c,C[maxN]; bool inQ[maxN];
int CostCuplaj,minim,nod,nodvcn,T[maxN],Cuplaj;
short int Cp[maxN][maxN],F[maxN][maxN],X[Emax],Y[Emax];

queue<short int>Q; int qsize;
vector< pair<short int,short int> >G[maxN];

inline void citire () {
	
	fscanf(f,"%d %d %d",&n,&m,&edge);
	
	for ( i = 1 ; i <= edge ; ++i ){
		fscanf(f,"%d %d %d",&x,&y,&c); y += dif;
		X[i] = x; Y[i] = y;
		G[x].push_back( make_pair(y,c) );
		G[y].push_back( make_pair(x,-c) );
		Cp[x][y] = 1;
	}
}

inline void newedges () {
	
	for ( i = 1 ; i <= n ; ++i ){
		G[S].push_back( make_pair(i,0) );
		Cp[S][i] = 1;
	}
	for ( i = 1 ; i <= m ; ++i ){
		G[i+dif].push_back( make_pair(D,0) );
		Cp[i+dif][D] = 1;
	}
}

inline void init () {
	
	memset(inQ,0,sizeof(inQ));
	memset(C,INF,sizeof(C));
	
	Q.push(S); qsize = 1; inQ[S] = 1; minim = INF; C[S] = 0;
}

inline bool bellmanford () {
	
	init(); vector< pair<short int,short int> >::iterator itt;
	
	while ( qsize ){
		nod = Q.front() ; Q.pop() ; --qsize; inQ[nod] = 0;
		
		for ( itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
			nodvcn = itt->first; c = itt->second;
			
			if ( Cp[nod][nodvcn] > F[nod][nodvcn] && C[nodvcn] > C[nod] + c ){
				C[nodvcn] = C[nod] + c; T[nodvcn] = nod;
				if ( !inQ[nodvcn] ){
					inQ[nodvcn] = 1;
					Q.push(nodvcn); ++qsize;
				}
			}
		}
	}
	
	if ( C[D] != INF ){
		
		for ( nod = D; T[nod] ; nod = T[nod] ){
			minim = Cp[T[nod]][nod] - F[T[nod]][nod] < minim ? Cp[T[nod]][nod] - F[T[nod]][nod] : minim;
		}
		for ( nod = D; T[nod] ; nod = T[nod] ){
			F[T[nod]][nod] += minim;
			F[nod][T[nod]] -= minim;
		}
	}
	
	return (C[D] != INF);
}

inline void cmcm () {
	
	while ( bellmanford() ){
		CostCuplaj += C[D] * minim;
		Cuplaj += minim;
	}
	
	fprintf(g,"%d %d\n",Cuplaj,CostCuplaj);
	
	for ( i = 1 ; i <= edge ; ++i ){
		if ( F[X[i]][Y[i]] ){
			fprintf(g,"%d ",i);
		}
	}
	fprintf(g,"\n");
}

int main () {
	
	citire();
	newedges();
	cmcm();
	
	fclose(f);
	fclose(g);
	
	return 0;
}