Cod sursa(job #669866)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 27 ianuarie 2012 21:40:27
Problema Cuplaj maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
// 0->1...m+n->m+n+1
#include <fstream>
#include <vector>
#include <queue>
#define NMAx 310
#define oo (1<<28)
using namespace std;
vector <short> G[2*NMAx],v;
queue <short> Q;
short n,m,S,D,sol,Cost[NMAx][NMAx],Flux[NMAx][NMAx];
short edge[NMAx][NMAx],tata[NMAx];
int color,dist[NMAx],in_queue[NMAx];

bool BF() {
	
	int i,nod,vecin;
	
	for(i=S;i<=D;i++)
		dist[i]=oo;
	color++;
	Q.push(S);
	dist[S]=0;
	
	while(!Q.empty()) {
		nod=Q.front();
		Q.pop();
		in_queue[nod]=0;
		for(i=0;i<G[nod].size();i++) {
			vecin=G[nod][i];
			if(Flux[nod][vecin]>0&&dist[vecin]>dist[nod]+Cost[nod][vecin]) {
				dist[vecin]=dist[nod]+Cost[nod][vecin];
				tata[vecin]=nod;
				if(in_queue[vecin]!=color) {
					Q.push(vecin);
					in_queue[vecin]=color;
					}
				}
			}
		}
	
	if(dist[D]==oo)
		return 0;
	return 1;
	
}
void constr() {
	
	int i;
	
	S=0;
	D=n+m+1;
	
	for(i=1;i<=n;i++) {
		G[S].push_back(i);
		//G[i].push_back(S);
		Flux[S][i]=1;
		}
	
	for(i=n+1;i<D;i++) {
		G[i].push_back(D);
		//G[D].push_back(i);
		Flux[i][D]=1;
		}
	
}
void citire() {
	
	int i,x,y,c,e;
	ifstream in("cmcm.in");
	in>>n>>m>>e;
	for(i=1;i<=e;i++) {
		in>>x>>y>>c;
		y+=n;
		G[x].push_back(y);
		G[y].push_back(x);
		Cost[x][y]=c;
		Cost[y][x]=-c;
		edge[x][y]=i;
		Flux[x][y]=1;
		}
	in.close();
	
}
void afis() {
	
	int i,j,nr=0;
	ofstream out("cmcm.out");
	
	for(i=1;i<=n;i++)
		for(j=n+1;j<D;j++)
			if(!Flux[i][j]&&edge[i][j]) {
				nr++;
				v.push_back(edge[i][j]);
				break;
				}
			
	out<<nr<<' '<<sol<<'\n';
	for(i=0;i<v.size();i++)
		out<<v[i]<<' ';
	out<<'\n';
	out.close();
	
}
int main() {
	
	int flux,nod;
	citire();
	constr();
	
	while(BF()) {
		
		flux=oo;
		for(nod=D;nod!=S;nod=tata[nod])
			flux=min(flux,(int)Flux[tata[nod]][nod]);
		
		for(nod=D;nod!=S;nod=tata[nod]) {
			Flux[nod][tata[nod]]+=flux;
			Flux[tata[nod]][nod]-=flux;
			}
		
		sol+=flux*dist[D];
		}
	
	afis();
	
	return 0;
}