竞赛讨论区 > J题史东城BUG求助< QWQ >
头像
CSUST_GXL
发布于 2022-04-01 20:21
+ 关注

J题史东城BUG求助< QWQ >

#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) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐