Advertisement
Guest User

Untitled

a guest
Mar 10th, 2021
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.23 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int INF = 1e9;
  5.  
  6. int main() {
  7.  
  8.   int n; cin >> n;
  9.   vector<vector<vector<int>>> dist(2, vector<vector<int>>(n, vector<int>(n, INF)));
  10.   for (int z = 0; z < 2; ++z) {
  11.     int m; cin >> m;
  12.     for (int i = 0; i < n; ++i)
  13.       dist[z][i][i] = 0;
  14.     for (int i = 0; i < m; ++i) {
  15.       int u, v, l; cin >> u >> v >> l;
  16.       dist[z][u][v] = dist[z][v][u] = l;
  17.     }
  18.     for (int k = 0; k < n; ++k)
  19.       for (int i = 0; i < n; ++i)
  20.         for (int j = 0; j < n; ++j)
  21.           dist[z][i][j] = min(dist[z][i][j], dist[z][i][k] + dist[z][k][j]);
  22.   }
  23.  
  24.   int k; cin >> k;
  25.   vector<int> inter(k + 2, 0);
  26.   for (int i = 1; i <= k; ++i)
  27.     cin >> inter[i];
  28.   k += 2;
  29.  
  30.   vector<vector<int>> dp(k, vector<int>(n, INF));
  31.   dp[0][0] = 0;
  32.   for (int i = 0; i + 1 < k; ++i)
  33.     for (int j = 0; j < n; ++j) {
  34.       if (dp[i][j] == INF) continue;
  35.       int now = inter[i], nxt = inter[i + 1];
  36.       for (int nj = 0; nj < n; ++nj) {
  37.         int nd = dp[i][j] + (nj == j ? dist[1][now][nxt]
  38.             : dist[1][now][j] + dist[0][j][nj] + dist[1][nj][nxt]);
  39.         dp[i + 1][nj] = min(dp[i + 1][nj], nd);
  40.       }
  41.     }
  42.   cout << dp[k - 1][0] << '\n';
  43.    
  44.   return 0;
  45. }
  46.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement