Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <set>
- using namespace std;
- struct Edge {
- int a, b, w;
- };
- vector<Edge> g[100010];
- int color[100010];
- vector<long long> dfs(int from, int to, int n) {
- vector<long long> dist(n);
- dist[to] = 1LL << 60;
- fill(color, color + n, 0);
- color[from] = -1;
- for (int i = 0; i < g[from].size(); i++) {
- int v = g[from][i].b;
- long long d = g[from][i].w;
- while (v != to) {
- color[v] = i + 1;
- dist[v] = d;
- for (auto &e : g[v]) {
- if (!color[e.b]) {
- v = e.b;
- d += e.w;
- }
- }
- }
- dist[to] = min(dist[to], d);
- }
- return dist;
- }
- int main() {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- int n, m, q;
- cin >> n >> m >> q;
- for (int i = 0; i < m; i++) {
- int a, b, w;
- cin >> a >> b >> w;
- g[a - 1].push_back({ a - 1, b - 1, w });
- g[b - 1].push_back({ b - 1, a - 1, w });
- }
- int beg = 0, end = n - 1;
- auto distBeg = dfs(beg, end, n);
- auto distEnd = dfs(end, beg, n);
- for (int qi = 0; qi < q; qi++) {
- int a, b;
- cin >> a >> b;
- a--;
- b--;
- long long res = 1LL << 60;
- res = min(res, distBeg[a] + distBeg[b]);
- res = min(res, distEnd[a] + distEnd[b]);
- res = min(res, distBeg[a] + distBeg[end] + distEnd[b]);
- res = min(res, distEnd[a] + distEnd[beg] + distBeg[b]);
- if (color[a] == color[b])
- res = min(res, max(distBeg[a], distBeg[b]) - min(distBeg[a], distBeg[b]));
- cout << res << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement