题目
思路
主要工作就是寻找最短路径
代码
#include<iostream>
using namespace std;
#include<vector>
#define long long long int
int main()
{
int n = 0, p = 0, c = 0;
cin >> n >> p >> c;
vector<int>cow(n+1);
for (int i = 1; i <= n; i++)
cin >> cow[i];//牛所在的位置
vector<vector<int>>dp(p + 1, vector<int>(p + 1));
for (int i = 1; i < p + 1; i++)
for (int j = 1; j < p + 1; j++)
{
if (i != j)
dp[i][j] = 1e6;
else
dp[i][j] = 0;
}
for (int i = 0; i < c; i++)
{
int r = 0, l = 0, w = 0;;
cin >> r >> l >> w;
dp[r][l] = dp[l][r] = w;//边的权值
}
for(int k=1;k<p+1;k++)
for(int i=1;i<p+1;i++)
for (int j = 1; j < p + 1; j++)
dp[i][j] = min(dp[i][j], dp[k][j] + dp[i][k]);//确定最短路径
long ans = 1e18;
for(int i=1;i<p+1;i++)
{
long res = 0;
for (int j = 1; j < n + 1; j++)
res += dp[i][cow[j]];
ans = min(ans, res);
}
cout << ans << endl;
return 0;
}