/*
ID:rayafjy1
PROG:butter
LANG:C++
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#define MAX_N 801
#define INF 9999999
using namespace std;
int n, m, c, map[MAX_N][MAX_N], a[MAX_N], dist[MAX_N], ct[MAX_N][MAX_N];
bool vis[MAX_N];
void SPFA(int s) {
int i;
memset(vis, 0, sizeof(vis));
for (i = 1; i <= n; i++) dist[i] = INF;
dist[s] = 0;
vis[s] = 1;
queue<int> q;
q.push(s);
while (!q.empty()) {
int p = q.front();
q.pop();
for (i = 1; i <= ct[p][0]; i++) {
int t = ct[p][i];
if ((dist[t] > dist[p] + map[p][t])) {
dist[t] = dist[p] + map[p][t];
if (!vis[t]) q.push(t);
vis[t] = 1;
}
}
vis[p] = 0;
}
}
int main() {
freopen("butter.in", "r", stdin);
freopen("butter.out", "w", stdout);
int i, j, x, y, z;
while (scanf("%d%d%d", &c, &n, &m) != EOF) {
memset(a, 0, sizeof(a));
memset(ct, 0, sizeof(ct));
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) map[i][j] = INF;
for (i = 0; i < c; i++) {
scanf("%d", &x);
a[x]++;
}
for (i = 0; i < m; i++) {
scanf("%d%d%d", &x, &y, &z);
map[x][y] = map[y][x] = z;
ct[x][0]++;
ct[x][ct[x][0]] = y;
ct[y][0]++;
ct[y][ct[y][0]] = x;
}
int output = INF, sum;
for (i = 1; i <= n; i++) {
sum = 0;
SPFA(i);
for (j = 1; j <= n; j++) sum += a[j] * dist[j];
output = min(output, sum);
}
printf("%d\n", output);
}
return 0;
}
uscao 3.2 Sweet Butter
最新推荐文章于 2022-02-25 21:57:21 发布