Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pii pair<int, int>
  3. #define x first
  4. #define y second
  5. using namespace std;
  6.  
  7. const int N = 1e5+5, C = 105, INF = 1e9;
  8.  
  9. struct data {
  10.     int x, y, d;
  11.     data(int x, int y, int d) : x(x), y(y), d(d) { }
  12.     data() : x(0), y(0), d(0) { }
  13. };
  14.  
  15. int n, m, q, cor[N], rcr[C], d[C][C], sz, id;
  16. data sssp[N][2];
  17. vector<pii> g[N];
  18.  
  19. void dfs(int rot, int u, int p, int w, int id) {
  20.     if(cor[u]) {
  21.         d[rot][cor[u]] = min(d[rot][cor[u]], w);
  22.         return;
  23.     }
  24.     if(!sssp[u][0].x) sssp[u][0] = data(w, rot, id);
  25.     else sssp[u][1] = data(w, rot, id);
  26.     for(auto v : g[u]) if(v.x != p) dfs(rot, v.x, u, w + v.y, id);
  27. }
  28.  
  29. int main() {
  30.     scanf("%d %d %d", &n, &m, &q);
  31.     fill(d[0], d[C-1] + C, INF);
  32.     while(m--) {
  33.         int u, v, w;
  34.         scanf("%d %d %d", &u, &v, &w);
  35.         g[u].emplace_back(v, w), g[v].emplace_back(u, w);
  36.     }
  37.     for(int i = 1; i <= n; ++i) if(g[i].size() > 2) {
  38.         cor[i] = ++sz; rcr[sz] = i;
  39.     }
  40.     if(!sz) cor[1] = ++sz, rcr[1] = 1;
  41.     for(int i = 1; i <= sz; ++i) {
  42.         d[i][i] = 0;
  43.         for(auto v : g[rcr[i]]) {
  44.             dfs(i, v.x, rcr[i], v.y, ++id);
  45.         }
  46.         sssp[rcr[i]][0] = sssp[rcr[i]][1] = data(0, i, id);
  47.     }
  48.     for(int i = 1; i <= n; ++i) if(!sssp[i][1].d) sssp[i][1] = data(0, 0, ++id);
  49.     for(int k = 1; k <= sz; ++k) for(int i = 1; i <= sz; ++i)
  50.     for(int j = 1; j <= sz; ++j) if(d[i][j] > d[i][k] + d[k][j])
  51.         d[i][j] = d[i][k] + d[k][j];
  52.     while(q--) {
  53.         int u, v, mn = 1e9; scanf("%d %d", &u, &v);
  54.         for(int i = 0; i < 2; ++i) for(int j = 0; j < 2; ++j) {
  55.         if(sssp[u][i].d == sssp[v][j].d) mn = min(mn, abs(sssp[u][i].x - sssp[v][j].x));
  56.         mn = min(mn, sssp[u][i].x + d[sssp[u][i].y][sssp[v][j].y] + sssp[v][j].x);
  57.         }
  58.         printf("%d\n", mn);
  59.     }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement