这也是一道比较简单的图论问题!
可以使用Floyd算法解决!
呵呵……
代码好下:
/*
ID: guo geer
PROG: butter
LANG: C++
*/
#include<iostream>
#include<cstring>
#include<string>
#include<fstream>
using namespace std;
#define MAXN 10000000
int pas[1000];
int dist[1000][1000];
int main(){
ifstream fin("butter.in");
ofstream fout("butter.out");
int n,p,c;
while(fin>>n>>p>>c)
{
memset(pas, 0, sizeof(pas));
int t;
for(int i=1; i<=n; i++)
{
fin>>t;
pas[t] ++;
}
for(int i=0; i<1000; i++)
for(int j=0; j<1000; j++)
if(i != j)
dist[i][j] = MAXN;
else dist[i][j] = 0;
int x, y;
for(int i=1; i<=c; i++)
{
fin>>x>>y>>t;
dist[x][y]=dist[y][x]=t;
}
for(int k=1; k<=p; k++)
for(int i=1; i<=p; i++)
for(int j=1; j<=p; j++)
if(dist[i][k]+dist[k][j] < dist[i][j])
{
dist[i][j] = dist[i][k]+dist[k][j];
dist[j][i] = dist[i][k]+dist[k][j];
}
int res, s;
res = MAXN;
for(int i=1; i<=p; i++)
{
s = 0;
for(int j=1; j<=p; j++)
if(s >= MAXN) s = MAXN;
else s += pas[j]*dist[i][j];
if(res > s) res = s;
}
fout<<res<<endl;
}
return 0;
}