func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = int(3e5), mod = int(1e9) + 7, block = 316;   int n, m, q;   vector<int> g[N], comp[N], heavy, di[N];   int root[N], cur, sz[N], d[N], dr[N], d1[N], d2[N];   bool used[N];   bool h[N];   long double ans[N], fans[N];   vector<pair<int, int> > qu[N];   void dfs(int v) {     used[v] = 1;     comp[cur].push_back(v);     sz[cur]++;     root[v] = cur;     for (int i = 0; i < g[v].size(); i++) {       int to = g[v][i];       if (!used[to]) dfs(to);     }   }   void dfs1(int v, int p = -1) {     used[v] = 1;     for (int i = 0; i < g[v].size(); i++) {       int to = g[v][i];       if (to == p) continue;       dfs1(to, v);       d1[v] = max(d1[v], d1[to] + 1);     }   }   void dfs2(int v, int p = -1) {     int mx1 = d2[v], mx2 = 0;     for (int i = 0; i < g[v].size(); i++) {       int to = g[v][i];       if (to == p) continue;       if (d1[to] + 1 > mx1) {         mx2 = mx1;         mx1 = d1[to] + 1;       } else if (d1[to] + 1 > mx2) {         mx2 = d1[to] + 1;       }     }     for (int i = 0; i < g[v].size(); i++) {       int to = g[v][i];       if (to == p) continue;       if (mx1 == d1[to] + 1) {         d2[to] = mx2 + 1;       } else         d2[to] = mx1 + 1;       dfs2(to, v);     }   }   int a[N], b[N], an, bn;   long long pref[N];   void cons(int v) {     an = 0;     for (int i = 0; i < di[v].size(); i++) {       a[++an] = di[v][i];     }     for (int i = 1; i <= an; i++) {       pref[i] = pref[i - 1] + a[i];     }   }   long double get(int v, int curd) {     bn = 0;     long long sum = 0;     for (int i = 0; i < di[v].size(); i++) {       b[++bn] = di[v][i];     }     int j = an;     for (int i = 1; i <= bn; i++) {       while (j > 0 && b[i] + a[j] + 1 > curd) j--;       sum += 1ll * j * curd + 1ll * (an - j) * b[i] + pref[an] - pref[j] + an - j;     }     return (sum + 0.0) / (1ll * an * bn);   }   int main() {     scanf( %d%d%d , &n, &m, &q);     for (int i = 1, u, v; i <= m; i++) {       scanf( %d%d , &u, &v);       g[u].push_back(v);       g[v].push_back(u);     }     for (int i = 1; i <= n; i++) {       if (!used[i]) {         cur = i;         dfs(i);       }     }     for (int i = 1; i <= n; i++) {       if (root[i] == i) {         if (sz[i] > block) {           heavy.push_back(i);           h[i] = 1;         }       }     }     memset(used, 0, sizeof(used));     for (int i = 1; i <= n; i++) {       if (!used[i]) {         dfs1(i);         dfs2(i);         int v = root[i];         for (int j = 0; j < comp[v].size(); j++) {           int u = comp[v][j];           dr[u] = max(d1[u], d2[u]);           di[v].push_back(dr[u]);           d[v] = max(d[v], dr[u]);         }         sort(di[v].begin(), di[v].end());       }     }     for (int i = 1, u, v; i <= q; i++) {       scanf( %d%d , &u, &v);       u = root[u];       v = root[v];       if (u == v) {         ans[i] = -1;       } else {         if (h[u]) {           qu[u].push_back(make_pair(v, i));         } else if (h[v]) {           qu[v].push_back(make_pair(u, i));         } else {           int curd = max(d[u], d[v]);           cons(u);           ans[i] = get(v, curd);         }       }     }     for (int i = 1; i <= n; i++) {       if (int(qu[i].size()) > 0) {         cons(i);         for (int j = 1; j <= n; j++)           if (root[j] == j) {             fans[j] = get(j, max(d[i], d[j]));           }         for (int j = 0; j < qu[i].size(); j++) {           ans[qu[i][j].second] = fans[qu[i][j].first];         }       }     }     for (int i = 1; i <= q; i++) {       printf( %.12lf n , double(ans[i]));     }     return 0;   }   