Cod sursa(job #295579)

Utilizator blahblahblahblah blahblah Data 3 aprilie 2009 14:06:28
Problema Team Scor 100
Compilator cpp Status done
Runda Simulare Marime 2.33 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define NMAX 510
#define INF 1000000010

int P, N, M;

int dist[NMAX][NMAX];

int d[NMAX];

int din[55][55][55];
char viz[55][55][55];

int dd[NMAX];
int coada[NMAX * NMAX];
char in_coada[NMAX];

int ddist[55][55];

void get_dist(int x)
{
	int p = 0, q = 0, i, c;
	coada[0] = x;

	memset(in_coada, 0, sizeof(in_coada));

	for (i = 1; i <= N; i++) dd[i] = INF;

	dd[x] = 0;
	in_coada[x] = 1;

	while (p <= q) {
		x = coada[p++];
		in_coada[x] = 0;


		for (i = 1; i <= N; i++)
			if ((c = dd[x] + dist[x][i]) < dd[i]) {
				dd[i] = c;
				if (!in_coada[i]) {
					coada[++q] = i;
					in_coada[i] = 1;
				}
			}
	}
}	

int calc(int x, int y, int k)
{
	if (x > y) return 0;
	if (viz[x][y][k]) return din[x][y][k];

	viz[x][y][k] = 1;

	int rez = INF;
	for (int i = x; i <= y; i++) 
		rez = min(rez, calc(x, i - 1, i) + calc(i + 1, y, i) + ddist[k][i]);

	return din[x][y][k] = rez;
}

int beg;
char s[110];

inline void GET(int &x)
{
	for (; s[beg] && !('0' <= s[beg] && s[beg] <= '9'); beg++);

	for (x = 0; '0' <= s[beg] && s[beg] <= '9'; beg++)
		x = x * 10 + s[beg] - '0';
}

int gen(int P, int N, int M)
{
	freopen("team.in", "w", stdout);

	printf("%d %d %d\n", P, N, M);

	int i;

	for (i = 1; i <= M; i++) {
		printf("%d %d %d\n", rand() % N + 1, rand() % N + 1, rand() % 100 + 1);
	}

	for (i = 1; i <= P; i++) printf("%d ", rand() % N + 1);
	printf("\n");

	fclose(stdout);

	return 0;
}

int main()
{
//	gen(50, 500, 100000);

	int i, j, x, y, c;

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

	scanf("%d %d %d\n", &P, &N, &M);

	for (i = 1; i <= N; i++)
		for (j = 1; j <= N; j++)
			if (i != j) dist[i][j] = INF;

	for (i = 1; i <= M; i++) {
//		scanf("%d %d %d", &x, &y, &c);
		fgets(s, 110, stdin); beg = 0;
		GET(x); GET(y); GET(c);

		dist[x][y] = min(dist[x][y], c);
		dist[y][x] = min(dist[y][x], c);
	}

/*	for (int k = 1; k <= N; k++)
		for (i = 1; i <= N; i++)
			for (j = 1; j <= N; j++)
				dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
*/
	for (i = 1; i <= P; i++) scanf("%d", &d[i]);
	d[0] = 1;

	for (i = 0; i <= P; i++) {
		get_dist(d[i]);

		for (j = 0; j <= P; j++) ddist[i][j] = dd[ d[j] ];
	}

	int rez = INF;

	for (i = 1; i <= P; i++) 
		rez = min(rez, calc(1, i-1, i) + calc(i + 1, P, i) + ddist[0][i]);

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

	return 0;
}