1.Dijkstra用于计算无向图两点之间最短路
一切全在代码里:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 7;
int n,m,s,t; //求s--t最短路
vector<pair<int,int>>p[N];//用来存图
int d[N]; //当前点到起点的最小距离
bool b[N]; //判断这个点是否被走过
void dije(int star) {
for(int i = 0; i <= n; i++) d[i] = INT_MAX; // 先让每个点到起点距离最大,便于计算
d[star] = 0; //起点到起点距离为0
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;//从小到大
//短边在前,提高效率
q.push({0,s}); //存储点到起点距离和这个点
while(!q.empty()) {
int u = q.top().second; //取点
q.pop();
if(b[u]) continue; //此点来过不在计算
b[u] = true;
for(auto it : p[u]) {
int distance = it.first;
int now = it.second;
if(d[u] + distance < d[now]) {
//若走这条路比他自身到起点进,就走这条
d[now] = d[u] + distance;
if(b[now] == false) q.push({d[now],now});
}
}
}
}
int main() {
cin >> n >> m >> s >> t;
while(m--) {
int a,b,c;
cin >> a >> b >> c;
p[a].push_back({c,b});//存储通向a的边及距离
p[b].push_back({c,a});//无向图两边都要存储
// 把距离c存在前面便于排序
}
dije(s);
if(d[t] == INT_MAX)
cout << -1;
else
cout << d[t];
return 0;
}
2.相关题:【模板】单源最短路径(弱化版) - 洛谷