Cod sursa(job #38408)

Utilizator filipbFilip Cristian Buruiana filipb Data 25 martie 2007 19:26:02
Problema Team Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.96 kb
// O(p^4 + p * N^2)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INFTY 2000000001
#define NMax 512
#define PMax 53
typedef struct lista { int id, cost; struct lista *next; } lista;
typedef lista *Graf[NMax];
typedef long matrix[NMax][NMax];

int n, p;
Graf G;
int loc[PMax];

matrix nou, vechi;

int D[PMax][PMax][PMax];
int dist[PMax][NMax];

	int Best;

void add_to_list(lista **l, int item, int cst)
{
	lista *tmp = (lista *)malloc(sizeof(lista));

	tmp->id = item;
	tmp->cost = cst;
	tmp->next = *l;
	*l = tmp;
}

void djikstra(int ix, int sursa)
{
	lista *f; int i, j, ind, uz[NMax], d[NMax];

	memset(uz, 0, sizeof(uz));
	for (i = 0; i <= n; i++) d[i] = 2000000001;

	d[sursa] = 0;
	for (i = 1; i < n; i++)
	{
		ind = 0;
		for (j = 1; j <= n; j++)
			if (d[j] < d[ind] && !uz[j])
				ind = j;
		uz[ind] = 1;
		for (f = G[ind]; f; f = f->next)
			if (d[f->id] > d[ind] + f->cost)
				d[f->id] = d[ind] + f->cost;
	}

	for (i = 1; i <= n; i++)
		dist[ix][i] = d[i];
}

void compute()
{
	int d, i, j, k, t;


	for (i = 0; i <= p; i++)
		djikstra(i, loc[i]);

	for (d = 1; d <= p; d++)
		for (i = 1; i <= p-d+1; i++)
		{
			j = i+d-1;
			for (k = 0; k <= p; k++)
			{
				D[k][i][j] = 2000000001;
				for (t = i; t <= j; t++)
					if (D[k][i][j] > D[t][i][t-1] + D[t][t+1][j] + dist[k][loc[t]])
						D[k][i][j] = D[t][i][t-1] + D[t][t+1][j] + dist[k][loc[t]];
			}
		}

    Best = D[0][1][p];

}

int main()
{
	int i, m, x, y, c;

	freopen("team.in", "r", stdin);
	freopen("team.out", "w", stdout);

	scanf("%d %d %d", &p, &n, &m);

	for (x = 1; x <= n; x++)
		for (y = 1; y <= n; y++)
			vechi[x][y] = INFTY;

	for (; m; m--)
	{
		scanf("%d %d %d", &x, &y, &c);
		add_to_list(&G[x], y, c);
		add_to_list(&G[y], x, c);
		vechi[x][y] = vechi[y][x] = c;
	}

	for (i = 1; i <= p; i++)
		scanf("%d", &loc[i]);
	loc[0] = 1;

	compute();

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

	return 0;
}