diff --git a/14lanqiao/test9-1.cpp b/14lanqiao/test9-1.cpp new file mode 100644 index 0000000..668f2e2 --- /dev/null +++ b/14lanqiao/test9-1.cpp @@ -0,0 +1,60 @@ +// lanqiao3516 景区导游(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){ + if(d[i][k] + d[k][j] < d[i][j]){ + 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 +*/ \ No newline at end of file