Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- const int M = 1e9+7;
- const int N = 1e7+5;
- const int INF = LLONG_MAX;
- int n, m;
- vector<vector<int>> adj;
- int memo[105][105][105];
- int floyd(int i, int j, int k) {
- if(k == 0) return adj[i][j];
- if(memo[i][j][k] != LLONG_MIN) return memo[i][j][k];
- __int128 a = floyd(i, k, k-1);
- __int128 b = floyd(k, j, k-1);
- int via = (a >= INF || b >= INF) ? INF : a + b;
- int res = min(floyd(i, j, k-1), via);
- // int res = min(floyd(i, j, k-1), floyd(i, k, k-1) + floyd(k, j, k-1));
- return memo[i][j][k] = res;
- }
- int32_t main() {
- cout << fixed << setprecision(3);
- int tt = 1;
- int a, b;
- while((cin >> a >> b) && (a != 0 && b != 0)) {
- vector<pair<int, int>> edges;
- edges.push_back({a, b});
- int u, v;
- int maxi = max(a, b);
- while((cin >> u >> v) && (u != 0 && v != 0)) {
- edges.push_back({u, v});
- maxi = max({u,v,maxi});
- }
- n = maxi;
- m = edges.size();
- // cin >> n >> m;
- adj.assign(n+1, vector<int>(n+1, INF));
- for (auto [u,v] : edges)
- {
- // int u, v;
- // cin >> u >> v;
- adj[u][v] = 1;
- }
- for (int i = 1; i < 105; ++i)
- {
- for (int j = 1; j < 105; ++j)
- {
- for(int k=1;k<105;++k) {
- memo[i][j][k] = LLONG_MIN;
- }
- }
- }
- for (int i = 1; i <= n; ++i)
- {
- for (int j = 1; j <= n; ++j)
- {
- if(i == j) adj[i][j] = 0;
- // else if(adj[i][j] == 0) adj[i][j] = INF;
- }
- }
- for (int i = 1; i <= n; ++i)
- {
- for (int j = 1; j <= n; ++j)
- {
- floyd(i, j, n);
- }
- }
- int sum = 0, cnt = 0;
- for(int i=1;i<=n;++i) {
- for(int j=1;j<=n;++j) {
- if(memo[i][j][n]!= INF && i != j){
- sum+=(memo[i][j][n]);
- cnt++;
- }
- // cout << memo[i][j][n] << " ";
- }
- // cout << endl;
- }
- if(tt != 1) cout << endl;
- cout << "Case " << tt++
- << ": average length between pages = "
- <<((double)sum / cnt) << " clicks";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment