Dijkstra算法(C++)

 开篇就是代码

#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

 狠狠滴点赞!

用自己的话逼逼一下算法思路:

选定一个开始节点出发,

每次都找离它最近的一个没录入最优路径的节点,然后将节点录入最优路径;

并更新这个新加入的节点跟周围的关系,也就是以新加入节点为中转站,能去到别的哪些节点,还有就是能不能离其他节点更近一点;

没了;挺好玩的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值