Dijkstra代码实现--单源最短路径(代码)

Dijkstra代码实现–单源最短路径

Dijkstra代码实现–单源最短路径(代码)

二刷数据结构,看到图的最短路径问题,自己实现了一下。具体原理网上有很多博客,大家可以看看。下面我采用C++和图的邻接矩阵实现了Dijkstra(话说这名字真难拼音…可能天才就是处处与众不同吧…滑稽)

需要牢记的是:Dijkstra只适合正权、可带环、有/无向图 的单源最短路径求和

/*
KATE
Dijkstra算法
13:56
15:38
*/
#include<bits/stdc++.h>
#define INF 999
using namespace std;

int ljjz[100][100];

void Dijkstra(int N,int M,int S){
	int num_of_true=0,now;
	int min_dist=INF,min_index=S,min_pre;
	//初始化
	bool visited[100];
	int path[100],dist[100];
	for(int i=1;i<=M;i++){
		dist[i]=INF; 
	 	path[i]=-1;
	 	if(i==S) {
	 		visited[i]=true;
	 		dist[i]=0;
	 		++num_of_true;
		 }
	 	else{
	 		visited[i]=false;
		 }
	}
	//重复部分
	while(num_of_true!=N){
		now=min_index;
		//找边 
		for(int i=1;i<=N;i++){
			if(ljjz[now][i]&&dist[i]==INF){
				if(dist[i]==INF) dist[i]=0;
				dist[i]=+ljjz[now][i];
				path[i]=now;
			}
		}
		//找最小边 
		min_dist=INF; 
		for(int i=1;i<=N;i++){
			if(!visited[i]){
				if(dist[i]<min_dist){
					min_dist=dist[i];
					min_index=i;
				}
			}
		}
		//add
		visited[min_index]=true;
		++num_of_true;
		//update
		for(int i=1;i<=N;i++){
			if(!visited[i]){
				if(!ljjz[min_index][i]) continue;
				int update=dist[min_index]+ljjz[min_index][i];
				if(dist[i]>update){
					dist[i]=update;
					path[i]=min_index;
				}
			}
		}	
	}
	//输出
	for(int i=1;i<=N;i++){
		cout<<"visited["<<i<<"]:"<<visited[i]<<"  dist["<<i<<"]:"<<dist[i]<<"  path["<<i<<"]:"<<path[i]<<endl;
	}
	 
	
}
int main(){
	int N,M,start;
	int temp1,temp2,temp3;
	cin>>N>>M>>start;
	for(int i=1;i<=M;i++){ 
	cin>>temp1>>temp2>>temp3;
	ljjz[temp1][temp2]=temp3;
	}
	Dijkstra(N,M,start);
	return 0;
} 

遇到的问题:
1.想偷懒,用语句初始化,但是容易出错。码了一个这个,希望自己有时间bu看ke看neng
https://blog.csdn.net/SmartLoveyu/article/details/100121485
2.结构体数组若声明了一个有参构造函数则必须声明一个无参的构造函数,有时间查查为啥
3.debug了40多分钟,有的地方有逻辑错误,不过总体上思维还是挺清晰。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值