Files
lanqiao/14lanqiao/test9-1.cpp

58 lines
1.3 KiB
C++

// lanqiao 3516 景区导游(floyd)
#include<bits/stdc++.h>
using namespace std;
const int N = 8e3 + 10, INF = INT_MAX;
bool vis[N]; // 标记数组
int d[N][N]; // 最段路数组
int n, m;
// floyd 求多源最短路 - 时间复杂度-O(n^3)
void floyd(){
// 枚举中转点
for(int k = 1; k <= n; k++){
// 枚举任意两点
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(d[i][k] != INF && d[k][j] != INF){
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}
}
int main(){
fill(d[0], d[0] + N * N, INF);
cin >> n >> m;
for(int i = 1; i <= n - 1; i++){
int u, v, w; cin >> u >> v >> w;
d[u][v] = d[v][u] = w;
}
vector<int> p;
for(int i = 1; i <= m; i++){
int v; cin >> v;
p.push_back(v);
}
floyd();
vector<int> vec = p;
for(int i = 0; i < p.size(); i++){
vec.erase(vec.begin() + i);
int ans = 0;
for(int j = 0; j < vec.size() - 1; j++){
int v = vec[j], u = vec[j+1];
ans += d[u][v];
}
cout << ans << ' ';
vec = p;
}
return 0;
}
/* test sanples -> 10 7 13 14
6 4
1 2 1
1 3 1
3 4 2
3 5 2
4 6 3
2 6 5 1
*/