TawratNibir

Untitled

Jan 30th, 2026
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. const int M = 1e9+7;
  6. const int N = 1e7+5;
  7. const int INF = LLONG_MAX;
  8. int n, m;
  9. vector<vector<int>> adj;
  10. int memo[105][105][105];
  11. int floyd(int i, int j, int k) {
  12.     if(k == 0) return adj[i][j];
  13.     if(memo[i][j][k] != LLONG_MIN) return memo[i][j][k];
  14.     int a = floyd(i, k, k-1);
  15.     int b = floyd(k, j, k-1);
  16.     int via = (a >= INF || b >= INF) ? INF : (long long)a + (long long)b;
  17.     int res = min(floyd(i, j, k-1), via);
  18.  
  19.     // int res = min(floyd(i, j, k-1), floyd(i, k, k-1) + floyd(k, j, k-1));
  20.     return memo[i][j][k] = res;
  21. }
  22. int32_t main() {
  23.     cout << fixed << setprecision(3);
  24.     int tt = 1;
  25.     int a, b;
  26.     while((cin >> a >> b) && (a != 0 && b != 0)) {
  27.         map<int,int> mp;
  28.         vector<pair<int, int>> edges;
  29.         if(mp.find(a)==mp.end()) mp[a] = mp.size()+1;
  30.         if(mp.find(b)==mp.end()) mp[b] = mp.size()+1;
  31.         edges.push_back({mp[a], mp[b]});
  32.     int u, v;
  33.     while((cin >> u >> v) && (u != 0 && v != 0)) {
  34.         if(mp.find(u)==mp.end()) mp[u] = mp.size()+1;
  35.         if(mp.find(v)==mp.end()) mp[v] = mp.size()+1;
  36.         edges.push_back({mp[u], mp[v]});
  37.     }
  38.     n = mp.size();
  39.     m = edges.size();
  40.     // cin >> n >> m;
  41.     adj.assign(n+1, vector<int>(n+1, INF));
  42.     for (auto [u,v] : edges)
  43.     {
  44.         // int u, v;
  45.         // cin >> u >> v;
  46.         adj[u][v] = 1;
  47.     }
  48.     for (int i = 0; i < 105; ++i)
  49.     {
  50.         for (int j = 0; j < 105; ++j)
  51.         {
  52.             for(int k=0;k<105;++k) {
  53.                 memo[i][j][k] = LLONG_MIN;
  54.             }        
  55.         }
  56.     }
  57.     for (int i = 1; i <= n; ++i)
  58.     {
  59.         for (int j = 1; j <= n; ++j)
  60.         {
  61.             if(i == j) adj[i][j] = 0;
  62.             // else if(adj[i][j] == 0) adj[i][j] = INF;
  63.         }
  64.     }
  65.     for (int i = 1; i <= n; ++i)
  66.     {
  67.         for (int j = 1; j <= n; ++j)
  68.         {
  69.             floyd(i, j, n);
  70.         }
  71.     }
  72.     int sum = 0, cnt = 0;
  73.     for(int i=1;i<=n;++i) {
  74.         for(int j=1;j<=n;++j) {
  75.             if(memo[i][j][n]!= INF && i != j){
  76.                 sum+=(memo[i][j][n]);
  77.                 cnt++;
  78.             }
  79.             // cout << memo[i][j][n] << " ";
  80.         }
  81.         // cout << endl;
  82.     }
  83.     if(tt != 1) cout << endl;
  84.     cout << "Case " << tt++
  85.     << ": average length between pages = "
  86.     <<((double)sum / cnt) << " clicks";
  87.     }
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment