Dijkstra算法例题
Dijkstra算法例题
最短路径算法
Dijkstra 算法(一般音译成迪杰斯特拉算法)无非就是一个 BFS 算法的加强版,它们都是从二叉树的层序遍历衍生出来的。
缺点:
迪杰斯特拉算法无法处理负权重边
例题:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 2510;
//初始化 g表示邻接矩阵 dist表示点x到每个点的距离 st表示是否走过这个节点
int g[N][N], dist[N], st[N];
int n = 2021;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int dijkstra() {
memset(dist, 0x3f, sizeof dist);//初始化dist数组,用memset设置每个字节 设0x3f为最大值
dist[1] = 0;//第一个节点到自己的距离为0
//依次选择节点
for (int i = 1;i <= n;i++) {
int t = -1;
//遍历所有节点
for (int j = 1;j <= n;j++) {
//如果j节点没有被走过 同时记录下j节点的下标,如果有距离更小的就更新
if (!st[j] && (t == -1 || dist[j] < dist[t]))
t = j;
}
//选择这个距离最小的下标 记录为走过
st[t] = 1;
//再次遍历所有节点
for (int j = 1;j <= n;j++) {
//到节点j距离最小是否要更新
dist[j] = min(dist[j], dist[t] + g[t][j]);
}
}
return dist[n];
}
int main() {
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++) {
if (i != j) {
if (fabs(i - j) <= 21) {//fabs()绝对值
g[i][j] = lcm(i, j);
g[j][i] = lcm(i, j);
}
else {
g[i][j] = 0x3f3f3f3f;
g[j][i] = 0x3f3f3f3f;
}
}
}
cout << dijkstra();
//cout<<0x3f3f3f3f;
return 0;
}
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16114128.html