Cod sursa(job #1467328)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 3 august 2015 11:32:24
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define MAX 605
#define INF 1<<30
#define min(a, b) (a < b ? a : b)
using namespace std;

vector<int> l[MAX];
int n, m, e, i, j, x, y, z, S, D, Nr, K;
int cost[MAX][MAX], C[MAX][MAX], F[MAX][MAX], Edge[MAX][MAX], Parent[MAX], d[MAX];
bool viz[MAX];

bool bellman();

int main(){
	freopen("cmcm.in", "r", stdin);
	freopen("cmcm.out", "w", stdout);
	scanf("%d%d%d", &n, &m, &e);
	for(i = 1; i <= e; i++){
		scanf("%d%d%d", &x, &y, &z);
		y += n;
		l[x].push_back(y);
		l[y].push_back(x);
		cost[x][y] = z;
		cost[y][x] = -z;
		C[x][y] = 1;
		Edge[x][y] = i;
	}

	S = 0;
	D = m + n + 1;

	for(i = 1; i <= n; i++){
		l[S].push_back(i);
		C[S][i] = 1;
	}

	for(i = n + 1; i <= m + n; i++){
		l[i].push_back(D);
		C[i][D] = 1;
	}

	while(bellman()){
		int minim = INF;
		int v = D;
		while(v != Parent[v]){
			int u = Parent[v];
			minim = min(minim, C[u][v] - F[u][v]);
			v = u;
		}
		v = D;
		while(v != Parent[v]){
			int u = Parent[v];
			F[u][v] += minim;
			F[v][u] -= minim;
			v = u;
		}

		Nr += minim;
		K += minim * d[D];
	}

	printf("%d %d\n", Nr, K);
	for(i = 1; i <= n; i++)
		for(j = n + 1; j <= n + m; j++)
			if(F[i][j])
				printf("%d ", Edge[i][j]);

	return 0;
}

bool bellman(){
	for(i = S; i <= D; i++){
		d[i] = INF;
		Parent[i] = 0;
		viz[i] = false;
	}

	d[S] = 0;
	queue<int> q;
	q.push(S);
	viz[S] = true;

	while(!q.empty()){
		int node = q.front();
		q.pop();
		viz[node] = false;

		if(node == D)
			continue;

		for(vector<int>::iterator it = l[node].begin(); it < l[node].end(); it++)
			if(C[node][*it] > F[node][*it] && d[*it] > d[node] + cost[node][*it]){
				d[*it] = d[node] + cost[node][*it];
				Parent[*it] = node;

				if(!viz[*it]){
					viz[*it] = true;
					q.push(*it);
				}
			}
	}

	return d[D] != INF;
}