Cod sursa(job #372719)

Utilizator FlorianFlorian Marcu Florian Data 11 decembrie 2009 14:13:11
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
using namespace std;
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define MAX_N 606
#define INF 0x3f3f3f3f
int N, M, L;
vector<int>G[MAX_N];
int capac[MAX_N][MAX_N];
int cst[MAX_N][MAX_N];
int nr_ord[MAX_N][MAX_N];
int tata[MAX_N];
char viz[MAX_N];
queue<int>Q;
int cstmin;
int d[MAX_N],S,D;
ifstream f("cmcm.in");
ofstream g("cmcm.out");
bool BFS()
{
	int x, y;
	unsigned i;
	Q.push(S);
	memset(d,INF,sizeof(d));
	memset(viz,0,sizeof(viz));
	d[S] = 0; viz[S] = 1; tata[S] = 0;
	for(;!Q.empty(); Q.pop())
	{
		x = Q.front(); viz[x] = 0;
		for( i = 0 ; i < G[x].size(); ++i)
		{
			y = G[x][i];			
			if(capac[x][y] && d[y] > d[x] + cst[x][y])
			{
				d[y] = d[x] + cst[x][y];
				tata[y] = x;
				if(viz[y] == 1) continue;
				Q.push(y);
				viz[y] = 1;
			}
		}
	}
	if(d[D] == INF) return 0;
	return 1;
}
void FLUX()
{
	int i, flux;
	for(;BFS();)
	{
		flux = INF;
		for( i = D; i!=S; i = tata[i])
			flux = min(flux, capac[tata[i]][i]);
		for( i = D; i!=S; i = tata[i])
		{
			capac[tata[i]][i] -= flux;
			capac[i][tata[i]] += flux;
		}
		cstmin += flux * d[D];
	}
}
int main()
{
	f>>N>>M>>L;
	int i,x,y,c,j, sol = 0;
	S = 0, D = N + M + 1;
	for(i = 1; i <= L; ++i)
	{
		f>>x>>y>>c;
		y += N;
		G[x].push_back(y); G[y].push_back(x);
		cst[x][y] = c; cst[y][x] = -c;
		capac[x][y] = 1;
		nr_ord[x][y] = i;
	}
	for(i = 1; i <= N; ++i)
	{
		G[S].push_back(i);
		G[i].push_back(S);
		capac[S][i] = 1;
	}
	for(i = N+1; i <= M + N; ++i)
	{
		G[D].push_back(i);
		G[i].push_back(D);
		capac[i][D] = 1;
	}
	FLUX();
	for(i = 1; i <= N; ++i)
		for(j = N+1; j<= M+N; ++j)
			if(nr_ord[i][j] && capac[i][j] == 0) { ++sol; break; }
	g<<sol<<" "<<cstmin<<"\n";
	for(i = 1; i <= N; ++i)
		for(j = N+1; j<= M+N; ++j)
			if(nr_ord[i][j] && capac[i][j] == 0) g<<nr_ord[i][j]<<" ";
	return 0;
}