Cod sursa(job #132984)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 7 februarie 2008 01:47:27
Problema Tproc Scor Ascuns
Compilator cpp Status done
Runda Marime 2.13 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#include <vector>
using namespace std;

#define NMAX 501
#define MMAX 501
#define MAX_PERM 20001
#define INF 666666666

vector<int> edge[MMAX];
int A[MMAX][MMAX];
int col[MMAX], mincol[MMAX], used[MMAX], p[MMAX];
int i, j, k, q, N, M, P, c, co, sco, extracost, cmin, maxcols;

void generateRandomPermutations(void)
{
	int perm;

	srand(time(NULL));
	
	cmin = INF;

	for (perm = 1; perm <= MAX_PERM; perm++)
	{
		memset(used, 0, sizeof(used));

		for (i = 1; i <= M; i++)
		{
			do
			{
				p[i] = 1 + (rand() % M);
			}
			while (used[p[i]]);

			used[p[i]] = 1;
			col[i] = -1;
		}

		// coloreaza nodurile in ordinea data de permutarea generata (greedy)

		col[p[1]] = 1;
		c = 0;

		for (i = 2; i <= M; i++)
		{
			// alege culoarea care minimizeaza costul suplimentar

			extracost = INF;
			for (co = 1; co <= maxcols; co++)
			{
				sco = 0;

				for (k = 0; k < edge[p[i]].size(); k++)
				{
					j = edge[p[i]][k];

					if (col[j] == co)
						sco += A[p[i]][j];
				}

				if (sco < extracost)
				{
					extracost = sco;
					col[p[i]] = co;
				}
			}

			c += extracost;
		}

		if (c < cmin)
		{
			cmin = c;
			memcpy(mincol, col, sizeof(col));
		}

		if (perm % 100 == 0)
			printf("perm %d -> cmin=%d\n", perm, cmin);
	}
}

int main()
{
	freopen("tproc.in", "r", stdin);

	scanf("%d %d %d", &N, &M, &maxcols);

	// ignora structura arborelui
	for (k = 1; k < N; k++)
		scanf("%d %d", &i, &j);

	// ignora membership information
	for (k = 1; k <= N; k++)
	{
		scanf("%d", &q);
		for (i = 1; i <= q; i++)
			scanf("%d", &j);
	}

	for (i = 1; i <= M; i++)
		edge[i].clear();

	scanf("%d", &P);

	memset(A, 0, sizeof(A));

	for (k = 1; k <= P; k++)
	{
		scanf("%d %d %d", &i, &j, &c);
		edge[i].push_back(j);
		edge[j].push_back(i);

		A[i][j] = A[j][i] = c;
	}

	generateRandomPermutations();

	printf("%d\n", cmin);

	for (i = 1; i <= M; i++)
		printf("%d ", mincol[i]);
	printf("\n");

	freopen("tproc.out", "w", stdout);
	printf("%d\n", cmin);

	return 0;
}