Cod sursa(job #150991)

Utilizator damaDamaschin Mihai dama Data 7 martie 2008 18:20:28
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#include <string.h>


const int nm = 410;
const int inf = 1 << 30;

int cost[nm][nm], c[nm][nm], prev[nm], n, m, sol, used[nm], d[nm];
int s[201][201];


int flux();
bool bf(int);

int main()
{
	freopen("paznici2.in", "r", stdin);
	freopen("paznici2.out", "w", stdout);
	
	int i, j;

	scanf("%d", &n);

	for(i = 1; i <= n; ++i)
	{
		c[0][i] = c[i + n][2 * n + 1] = 1;
		for(j = 1; j <= n; ++j)
		{
			scanf("%d", &cost[i][n + j]);
			c[i][n + j] = 1;
			cost[n + j][i] = -cost[i][n + j];
		}
	}
	sol = flux();
	printf("%d\n", sol);

	for(i = n + 1; i <= 2 * n; ++i) // obiectiv
	{
		(void)bf(i);
		for(j = 1; j <= n; ++j) // paznic
		{
			if(cost[j][i] + d[j] == 0)
			{
				s[i - n][++s[i - n][0]] = j;
			}
		}
	}

	for(i = 1; i <= n; ++i)
	{
		printf("%d", s[i][0]);
		for(j = 1; j <= s[i][0]; ++j)
		{
			printf(" %d", s[i][j]);
		}
		printf("\n");
	}

	return 0;
}

int flux()
{
	int temp;
	while(bf(0))
	{
		sol += d[2 * n + 1];
		temp = 2 * n + 1;
		while(prev[temp] != -1)
		{
			++c[temp][prev[temp]];
			--c[prev[temp]][temp];
			temp = prev[temp];
		}
	}
	return sol;
}

bool bf(int nod)
{
	int q[40010], st, dr, i, crt;

	for(i = 1; i <= 2 * n + 1; ++i)
	{
		d[i] = inf;
		prev[i] = -1;
	}
	prev[0] = -1;
	memset(used, 0, sizeof(used));
	d[nod] = 0;
	st = dr = 1;
	q[st] = nod;

	while(st <= dr)
	{
		crt = q[st];
		used[crt] = 0;
		for(i = 1; i <= 2 * n + 1; ++i)
		{
			if(c[crt][i] && d[i] > d[crt] + cost[crt][i])
			{
				d[i] = d[crt] + cost[crt][i];
				prev[i] = crt;
				if(!used[i])
				{
					q[++dr] = i;
					used[i] = 1;
				}
			}
		}
		++st;
	}
	return (d[2 * n + 1] != inf); 
}