#include<iostream> #include<cstring> #include<queue> #include<vector> using namespace std; typedef pair<int, int>pii; //#define first fi; //#define second sc; typedef long long ll; int n, m, t; int v, w, d; bool vis[100000 + 5]; ll dis[100000 + 5]; vector<pair<int, int>>G[100000 + 5];//pair分别存储距离 dis,以及到达点 to void dijkstra(int root) {//写法有点问题 memset(dis, 0x3f, sizeof(dis)); dis[root] = 0;//初始化dis数组 priority_queue<pii, vector<pii>, greater<pii> >heap;//小根堆 // vis[root] = 1; heap.push({0, root}); while (!heap.empty()) { pii p = heap.top(); int to = p.second, d = p.first;//把当前衍生点距离最小d所在点取出 heap.pop(); if (vis[to]) continue; vis[to] = true; for (auto it : G[to]) { int w = it.second, v = it.first;//w,v 分别表示目前中转点,以及到此中转点的距离 if (dis[w] > dis[to] + v) {//如果经过当前中转点去下一个衍生点距离更小,则更新并放入heap dis[w] = dis[to] + v; heap.push({dis[w], w}); } } } } int main() { std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> v >> w >> d; G[v].push_back(make_pair(d, w)); G[w].push_back(make_pair(d, v)); } dijkstra(1);//救救孩子 cin >> t; while (t--) { int s, e; cin >> s >> e; cout << dis[s] + dis[e] << endl; } return 0; }
全部评论
(2) 回帖