// lanqiao 3516 景区导游(floyd) #include 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 p; for(int i = 1; i <= m; i++){ int v; cin >> v; p.push_back(v); } floyd(); vector 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 */