Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <set>
  5. using namespace std;
  6.  
  7. struct Edge {
  8. int a, b, w;
  9. };
  10.  
  11. vector<Edge> g[100010];
  12. int color[100010];
  13.  
  14. vector<long long> dfs(int from, int to, int n) {
  15. vector<long long> dist(n);
  16. dist[to] = 1LL << 60;
  17.  
  18. fill(color, color + n, 0);
  19. color[from] = -1;
  20.  
  21. for (int i = 0; i < g[from].size(); i++) {
  22. int v = g[from][i].b;
  23. long long d = g[from][i].w;
  24. while (v != to) {
  25. color[v] = i + 1;
  26. dist[v] = d;
  27. for (auto &e : g[v]) {
  28. if (!color[e.b]) {
  29. v = e.b;
  30. d += e.w;
  31. }
  32. }
  33. }
  34. dist[to] = min(dist[to], d);
  35. }
  36.  
  37. return dist;
  38. }
  39.  
  40. int main() {
  41. freopen("input.txt", "r", stdin);
  42. freopen("output.txt", "w", stdout);
  43.  
  44. int n, m, q;
  45. cin >> n >> m >> q;
  46.  
  47. for (int i = 0; i < m; i++) {
  48. int a, b, w;
  49. cin >> a >> b >> w;
  50. g[a - 1].push_back({ a - 1, b - 1, w });
  51. g[b - 1].push_back({ b - 1, a - 1, w });
  52. }
  53.  
  54. int beg = 0, end = n - 1;
  55. auto distBeg = dfs(beg, end, n);
  56. auto distEnd = dfs(end, beg, n);
  57.  
  58. for (int qi = 0; qi < q; qi++) {
  59. int a, b;
  60. cin >> a >> b;
  61. a--;
  62. b--;
  63.  
  64. long long res = 1LL << 60;
  65. res = min(res, distBeg[a] + distBeg[b]);
  66. res = min(res, distEnd[a] + distEnd[b]);
  67. res = min(res, distBeg[a] + distBeg[end] + distEnd[b]);
  68. res = min(res, distEnd[a] + distEnd[beg] + distBeg[b]);
  69. if (color[a] == color[b])
  70. res = min(res, max(distBeg[a], distBeg[b]) - min(distBeg[a], distBeg[b]));
  71.  
  72. cout << res << " ";
  73. }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement