Cod sursa(job #11832)

Utilizator MariusMarius Stroe Marius Data 1 februarie 2007 21:26:41
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <cstdio>
#include <memory>
using namespace std;

const char iname[] = "c:\\input.txt";
const char oname[] = "c:\\output.txt";

#define MAX_N 111
#define INF   222

int num;

int sum;

int C[MAX_N][MAX_N];

int F[MAX_N][MAX_N];

int Q[MAX_N], V[MAX_N], P[MAX_N];


inline int MIN(const int a, const int b) {
	if (a < b)	return a;
	return b;
}

int BF(int srs, int dst)
{
	int l;
	int r;
	memset(V, 0, sizeof(V));
	for (Q[l = r = 0] = srs, V[srs] = INF; l <= r; ++l) {
		int h = Q[l];
		for (int i = 1; i <= num; ++i) {
			if ((V[i] == 0) && (C[h][i] - F[h][i] > 0)) {
				V[i] = MIN(V[h], C[h][i] - F[h][i]);
				P[i] = h;
				if (i == dst) {
					for (; i != srs; i = P[i]) {
						F[ P[i] ][i] += V[dst];
						F[i][ P[i] ] -= V[dst];
					}
					return V[dst];
				}
				Q[++ r] = i;
			}
		}
	}
	return 0;
}

int EK(int srs, int dst)
{
	memset(F, 0, sizeof(F));
	int min_cut = 0;
	while (true) {
		int size_flow = BF(srs, dst);
		if (size_flow > 0)
			min_cut += size_flow;
		else
			break ;
	}
	return min_cut;
}

void print_out(int srs, int dst)
{
	memset(F, 0, sizeof(F));
	while (BF(srs, dst))
		;
	int l;
	int r;
	int i;
	int Res = 1;
	memset(V, 0, sizeof(V));
	for (Q[l = r = 0] = srs, V[srs] = 1; l <= r; ++l) {
		int h = Q[l];
		for (i = 1; i <= num; ++i) {
			if ((V[i] == 0) && (C[h][i] - F[h][i] > 0))
				V[Q[++ r] = i] = 1, Res ++;
		}
	}
	printf("%d\n", Res);
	for (i = 1; i <= num; ++i)
		if (V[i] == 1)	printf("%d ", i);
}

int main(void)
{
	freopen(iname, "r", stdin);
	int i;
	int j;
	for (scanf("%d", & num), i = 1; i <= num; ++i) {
		for (j = 1; j <= num; ++j) {
			scanf("%d", C[i] + j);
			if (i < j)
				sum += C[i][j];
		}
	}
	int min_cut = int(1e9);
	int sink;
	for (i = 2; i <= num; ++i) {
		int cut = EK(1, i);
		if (min_cut > cut)
			min_cut = cut, sink = i;
	}
//	freopen(oname, "w", stdout);
	printf("%d ", sum - min_cut);
	print_out(1, sink);
	return 0;
}