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多分钟,有的地方有逻辑错误,不过总体上思维还是挺清晰。