58 lines
1.3 KiB
C++
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
|
|
*/ |