leoanjos

GPS I Love You

Mar 15th, 2023
784
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define llong long long int
  6.  
  7. const int INF = 1e9 + 5;
  8.  
  9. vector<int> route;
  10. vector<vector<int>> edge, dist;
  11. vector<vector<int>> memo;
  12.  
  13. int roads(int l, int r) {
  14.     int sum = 0;
  15.     for (int i = l; i < r; i++)
  16.         sum += edge[route[i]][route[i + 1]];
  17.  
  18.     if (dist[route[l]][route[r]] == sum) return 0;
  19.  
  20.     int &ans = memo[l][r];
  21.     if (~ans) return ans;
  22.  
  23.     ans = INF;
  24.     for (int m = l; m < r; m++)
  25.         ans = min(ans, roads(l, m) + roads(m + 1, r) + 1);
  26.  
  27.     return ans;
  28. }
  29.  
  30. int main() {
  31.     ios_base::sync_with_stdio(false);
  32.     cin.tie(NULL);
  33.  
  34.     int n, t = 1;
  35.     while (cin >> n, n) {
  36.         edge.assign(n, vector<int>(n));
  37.         dist.assign(n, vector<int>(n));
  38.  
  39.         for (int i = 0; i < n; i++)
  40.             for (int j = 0; j < n; j++) {
  41.                 cin >> edge[i][j];
  42.  
  43.                 dist[i][j] = edge[i][j];
  44.                 if (i != j && !dist[i][j])
  45.                     dist[i][j] = INF;
  46.             }
  47.  
  48.         for (int k = 0; k < n; k++)
  49.             for (int i = 0; i < n; i++)
  50.                 for (int j = 0; j < n; j++)
  51.                     dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
  52.  
  53.         int m; cin >> m;
  54.  
  55.         route.resize(m);
  56.         for (int i = 0; i < m; i++)
  57.             cin >> route[i];
  58.  
  59.         memo.assign(m + 5, vector<int>(m + 5, -1));
  60.  
  61.         int ans = roads(0, m - 1);
  62.         cout << "Case " << t++ << ": " << ans << "\n";
  63.     }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment