Pagini recente » Cod sursa (job #1097474) | Cod sursa (job #874310) | Cod sursa (job #128632) | Cod sursa (job #3130672) | Cod sursa (job #132984)
Cod sursa(job #132984)
#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;
}