inlinevoiddijkstra(){ for (int i = 1; i <= n; ++i)dis[i] = 0x7fffffff; dis[s] = 0; q.push({ 0, s });
while (!q.empty()) { int u = q.top().second;//由于点的维护依靠的是小根堆,堆顶的元素即是《未访问节点中 距离最小的节点》 q.pop(); if (vis[u]) continue; vis[u] = 1;
for (auto& v : G[u]) {//邻接点访问 if (dis[v.second] > dis[u] + v.first) { dis[v.second] = dis[u] + v.first; if (!vis[v.second]) { q.push({ dis[v.second], v.second });//当前更新节点未完成更新(未被标记),将当前节点和当前节点长度入队 } } }
} }
/////////MAIN///////// cin >> n >> m >> s; //register关键字表示使用cpu内部寄存器,这将加快变量的读写速度 for (registerint i = 0; i < m; ++i){ registerint u, v, w; cin >> u >> v >> w; G[u].push_back({ w,v });//有向图 }
// u v w int from[MAXE], to[MAXE], weight[MAXE]; //dis为原点到当前节点的最短路径 pre存储最短路径的前后关系 int dis[MAXN], pre[MAXN];
voidbellmon(){ for (int i = 0; i < n; i++)dis[i] = inf;//初始化距离为极大值 dis[1] = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { int u = from[j], v = to[j], w = weight[j]; if(dis[u] + w < dis[v]) { //《松弛》操作,如果u到v有一条边,dis[v]存储u到v的最短边 dis[v] = dis[u] + w; //pre表示最短路径上v的前一个节点是u pre[v] = u; } } }