Cod sursa(job #902648)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 1 martie 2013 15:47:10
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <vector>
#include <queue>
#define nmax 610
#define oo (1<<30)
#define Vecin G[Nod][i]
using namespace std;

queue <int> Q;
vector <int> G[nmax],Answer;
int N,M,Flow[nmax][nmax],Edge[nmax][nmax];
int Source,Destination,Cost[nmax][nmax];
int MaxFlow,T[nmax],Dist[nmax];
bool inQ[nmax];

bool BellmanFord() {
	
	int i,Nod;
	
	for(i=Source;i<=Destination;i++)
		Dist[i]=oo;
	
	Dist[Source]=0;
	Q.push(Source);
	
	while(!Q.empty()) {
		
		Nod=Q.front();
		inQ[Nod]=false;
		Q.pop();
		
		for(i=0;i<G[Nod].size();i++)
			if(Flow[Nod][Vecin] && Dist[Vecin]>Dist[Nod]+Cost[Nod][Vecin]) {
				
				Dist[Vecin]=Dist[Nod]+Cost[Nod][Vecin];
				T[Vecin]=Nod;
				
				if(!inQ[Vecin]) {
					Q.push(Vecin);
					inQ[Vecin]=true;
					}
				
				}
		
		}
	
	return (Dist[Destination]!=oo);
	
}
void solve() {
	
	int i,j,Nod;
	
	Source=0;
	Destination=N+M+1;
	
	for(i=1;i<=N;i++) {
		G[Source].push_back(i);
		Flow[Source][i]=1;
		}
	
	for(i=N+1;i<Destination;i++) {
		G[i].push_back(Destination);
		Flow[i][Destination]=1;
		}
	
	while(BellmanFord()) {
		
		for(Nod=Destination;Nod!=Source;Nod=T[Nod]) {
			Flow[Nod][T[Nod]]++;
			Flow[T[Nod]][Nod]--;
			}
		
		MaxFlow+=Dist[Destination];
		
		}
	
	for(i=1;i<=N;i++)
		for(j=N+1;j<Destination;j++)
			if(!Flow[i][j] && Edge[i][j]) {
				Answer.push_back(Edge[i][j]);
				break;
				}
	
}
void read() {
	
	int x,y,c,i,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;
		Flow[x][y]=1;
		Edge[x][y]=i;
		
		}
	
	in.close();
	
}
void write() {
	
	ofstream out("cmcm.out");
	
	out<<Answer.size()<<' '<<MaxFlow<<'\n';
	for(int i=0;i<Answer.size();i++)
		out<<Answer[i]<<' ';
	
	out<<'\n';
	out.close();
	
}
int main() {
	
	read();
	solve();
	write();
	
	return 0;
	
}