开篇就是代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
//定义一些常规数据
#define MAX_ROW 1005
#define MAX_COL 1005
#define Inf 0x3f3f3f3f
//要有信息保存点和边
int n,m;
//用邻接矩阵来保存图的数据
int map[MAX_ROW][MAX_COL];
//dist数组保存距离
//solve数组保存是否是最优路径-1表示不是,1表示是的
//pre数组保存最优路径,此节点的上一个节点
int dist[MAX_ROW],solve[MAX_ROW],pre[MAX_ROW];
void input(){
//初始化:清空数组,然后是点到自己的距离是0
memset(map,Inf,sizeof(map));
for(int i=1;i<=n;++i) map[i][i]=0;
cout<<"输入边的信息"<<endl;
//输入边的信息
for(int i=1;i<=m;++i){
int u,v,w;
cin>>u>>v>>w;
map[u][v]=w;
map[v][u]=w;
}
}
void Dijkstra(int u){
//将最优路径设置为空
memset(solve,-1,sizeof(solve));
//将距离和上一个节点也设置一下
memset(dist,Inf,sizeof(dist));
memset(pre,-1,sizeof(pre));
//以u开始,初始化
for(int i=1;i<=n;++i){
if(map[u][i]!=Inf){
dist[i]=map[u][i];
pre[i]=u;
}
}
solve[u]=1;
//循环
for(int i=1;i<n;++i){
//每次循环取出dist中最小的值
int min=Inf,idx;
for(int j=1;j<=n;++j){
if(solve[j]!=1 && dist[j]<min){
min=dist[j];
idx=j;
}
}
solve[idx]=1;
//然后更新它周围能连接的距离的较小值
for(int j=1;j<=n;++j){
if(dist[idx]+map[idx][j] < dist[j]){
dist[j] = dist[idx]+map[idx][j];
pre[j] = idx;
}
}
}
}
int main(){
//输入点和边
cout<<"输入点和边:";
cin>>n>>m;
//输入图的数据,包括点和边的数值
input();
//寻找最短路径
Dijkstra(1);
//输出dist数组
for(int i=1;i<=n;++i) cout<<dist[i]<<" ";
cout<<endl;
return 0;
}
运行截图如下
思路参考B站视频【算法】最短路径查找—Dijkstra算法_哔哩哔哩_bilibili
狠狠滴点赞!
用自己的话逼逼一下算法思路:
选定一个开始节点出发,
每次都找离它最近的一个没录入最优路径的节点,然后将节点录入最优路径;
并更新这个新加入的节点跟周围的关系,也就是以新加入节点为中转站,能去到别的哪些节点,还有就是能不能离其他节点更近一点;
没了;挺好玩的