Advertisement
matheus_monteiro

Trem da Mina

Sep 18th, 2021
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ii pair<int, int>
  4. #define fi first
  5. #define se second
  6. const int MAX = 10006;
  7. #define OO 0x3f3f3f3f
  8.  
  9. int n, m;
  10. vector<ii> G[MAX];
  11. bool cor[MAX];
  12. int pai[MAX];
  13. int W[MAX];
  14. int nivel[MAX];
  15. bool mark[MAX];
  16. int F[MAX];
  17. int dist[MAX];
  18. vector<vector<int>> C;
  19. int number[MAX];
  20.  
  21. void dfs(int v, int p, int d, int e) {
  22.     cor[v] = 1;
  23.     pai[v] = p;
  24.     nivel[v] = d;
  25.     W[v] = e;
  26.  
  27.     for(int i = 0; i < G[v].size(); i++) {
  28.         int u = G[v][i].fi, w = G[v][i].se;
  29.         if(cor[u] == 0) {
  30.             dfs(u, v, d + 1, w);
  31.         } else if(u != p and !mark[v]) {
  32.             // percorre o ciclo
  33.             int cost = w;
  34.             int a = v, b = u;
  35.             mark[a] = mark[b] = true;
  36.             vector<int> cyc = {a, b};
  37.             while(a != b) {
  38.                 if(nivel[a] < nivel[b]) {
  39.                     cost += W[b];
  40.                     b = pai[b];
  41.                     cyc.push_back(b);
  42.                 } else {
  43.                     cost += W[a];
  44.                     a = pai[a];
  45.                     cyc.push_back(a);
  46.                 }
  47.                 mark[a] = mark[b] = true;
  48.             }
  49.             C.push_back(cyc);
  50.             for(int c : cyc) F[c] = cost, number[c] = C.size();
  51.         }
  52.     }
  53. }
  54.  
  55. void dijkstra(int cycle) {
  56.     memset(dist, 63, sizeof(dist));
  57.     priority_queue<ii> pq;
  58.        
  59.     for(int i = 0; i < n; i++)
  60.         if(number[i] == cycle)
  61.             pq.push({0, i}), dist[i] = 0;
  62.    
  63.     while(!pq.empty()) {
  64.         int u = pq.top().second;
  65.         int d = -pq.top().first;
  66.         pq.pop();
  67.         if(d > dist[u]) continue;
  68.         for(int i = 0; i < G[u].size(); i++) {
  69.             int w = G[u][i].first, _d = G[u][i].second;
  70.             if(number[w] == number[u] and number[w] == cycle)
  71.                 _d = 0;
  72.             if(dist[w] > d + _d) {
  73.                 dist[w] = d + _d;
  74.                 pq.push({-dist[w], w});
  75.             }
  76.         }
  77.     }
  78. }
  79.  
  80. int32_t main() {
  81.     ios_base::sync_with_stdio(false);
  82.     cin.tie(nullptr);
  83.    
  84.     cin >> n >> m;
  85.  
  86.     for(int i = 0; i < m; i++) {
  87.         int u, v, w;
  88.         cin >> u >> v >> w; u--; v--;
  89.         G[u].push_back({v, w});
  90.         G[v].push_back({u, w});
  91.     }
  92.  
  93.     for(int i = 0; i < n; i++)
  94.         if(!cor[i])
  95.             dfs(i, -1, 0, 0);
  96.  
  97.     int k;
  98.     cin >> k;
  99.     vector<ii> Q;
  100.     for(int i = 0; i < k; i++) {
  101.         int v, T;
  102.         cin >> v >> T; v--;
  103.         Q.push_back({v, T});
  104.     }
  105.  
  106.     vector<int> ans(k, OO);
  107.     for(int c = 1; c <= C.size(); c++) {
  108.         dijkstra(c);
  109.         for(int i = 0; i < Q.size(); i++)
  110.             if(Q[i].se <= F[C[c - 1].back()])
  111.                 ans[i] = min(ans[i], F[C[c - 1].back()] + 2 * dist[ Q[i].fi ]);
  112.     }
  113.  
  114.     for(int i = 0; i < ans.size(); i++) {
  115.         if(ans[i] >= OO) ans[i] = -1;
  116.         cout << ans[i] << '\n';
  117.     }
  118.  
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement