#include<iostream>
#include<cstdio>
using namespace std;
const int MAX=9999999;
const int MAXN=20;
int dist[MAXN];//存储最短路径
bool s[MAXN];//存储已经找到最短路径的结点
int u[MAXN][MAXN];//存储邻接矩阵
int front[MAXN];//记录每个点最短路径上的前一个点
int n;
void dijkstra(){
for(int i=1;i<=n;i++){//预置最短路径为最大
dist[i]=MAX;
}
for(int i=1;i<=n;i++){
s[i]=false;
}
s[1]=true; //起始点放入 s 数组
front[1]=1;
dist[1]=0;
int temp=1;//中转点
int num=1;
int tempmin=MAX;
while(num<n){
for(int i=1;i<=n;i++){
if(u[temp][i]!=MAX && !s[i]){//中转点到某个点 i 有路径,并且点i还没有进入 s数组
//dist[i]=min(dist[temp]+u[temp][i],dist[i]);
if(dist[temp]+u[temp][i]<dist[i]){
dist[i]=dist[temp]+u[temp][i];
front[i]=temp;//记录一下前一个元素
}
}
}
for(int i=1;i<=n;i++){
if(!s[i] && dist[i]<tempmin){
temp=i;//设为中转点
tempmin=dist[i];
} //找到当前最短距离的点
}
s[temp]=true;//放入 s数组
num++;
tempmin=MAX;
}
}
void traceback(){//路径查找
int stack[MAXN];
int top=0;
for(int i=2;i<=n;i++){
int j=i;
stack[top++]=i;
while(front[j]!=j){
stack[top++]=front[j];
j=front[j];
}
while(top>0){
printf("%d ",stack[--top]);
}
printf("\n");
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&u[i][j]);
}
}
dijkstra();
for(int i=1;i<=n;i++){
printf("%d ",dist[i]);
}
printf("\n");
traceback();
}
用邻接矩阵实现Dijkstra算法
最新推荐文章于 2023-06-09 10:46:06 发布