Cod sursa(job #553036)

Utilizator raduzerRadu Zernoveanu raduzer Data 13 martie 2011 14:20:12
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <cstring>

const int MAX_P = 51;
const int MAX_N = 501;
const int INF = 0x3f3f3f3f;

int p, n, m;
int a[MAX_P], f[MAX_N];
int v[MAX_N][MAX_N], dist[MAX_P][MAX_N];
int d[MAX_N][MAX_P][MAX_P];

int get(int nod, int st, int dr)
{
	if (st > dr)
		return 0;
	if (st == dr)
		return dist[st][nod];
	if (d[nod][st][dr] != -1)
		return d[nod][st][dr];

	d[nod][st][dr] = INF;

	for (int i = st; i <= dr; ++i)
	{
		int x = dist[i][nod] + get(a[i], st, i - 1) + get(a[i], i + 1, dr);

		if (d[nod][st][dr] > x)
			d[nod][st][dr] = x;
	}

	return d[nod][st][dr];
}

void dijkstra(int nod, int dist[])
{
	int i;
	memset(f, 0, sizeof(f));

	for (i = 1; i <= n; ++i)
		dist[i] = INF;
	dist[nod] = 0;

	while (1)
	{
		int mn = INF, p;

		for (i = 1; i <= n; ++i)
			if (!f[i] && mn > dist[i])
				mn = dist[i], p = i;

		if (mn == INF)
			break;
		f[p] = 1;

		for (i = 1; i <= n; ++i)
			if (dist[i] > dist[p] + v[p][i])
				dist[i] = dist[p] + v[p][i];
	}
}

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

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

	memset(v, INF, sizeof(v));

	for (i = 1; i <= m; ++i)
	{
		int x, y, z;

		scanf("%d %d %d", &x, &y, &z);

		v[x][y] = v[y][x] = z;
	}

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

		dijkstra(a[i], dist[i]);
	}

	memset(d, -1, sizeof(d));

	printf("%d\n", get(1, 1, p));
}