C语言实现最短路径
题目在https://blog.csdn.net/qq_42453280/article/details/105976017这个链接上
算法是使用https://www.bilibili.com/video/BV1b7411N798?p=63&vd_source=8ef55476b38a417a7a8056caa65608f2上的王道数据结构P63 Dijkstra最短路径算法思路,将它代码化,下面是源代码
#include <stdio.h>
#include <stdbool.h>
#define INT 30000
//#define SIZE 7
//
//void table_init(int *p_table, int width);
//void table_show(int *p_table, int width);
int min(int *dist,int *final,int num);
int main() {
int dist[7];//存放从起始点到终点的距离
int path[7];//存放起始点到终点的上一个节点
int final[7];//存放是否已经找到了终点
int start = 0;//who
int end;
printf("end:");
scanf("%d",&end);
printf("\n");
int table[7][7]={{INT,4,6,6,INT,INT,INT},
{INT,INT,1,INT,7,INT,INT},
{INT,INT,INT,INT,6,4,INT},
{INT,INT,2,INT,INT,5,INT},
{INT,INT,INT,INT,INT,INT,6},
{INT,INT,INT,INT,1,INT,8},
{INT,INT,INT,INT,INT,INT,INT}};
for(int i=0;i<7;i++){
dist[i] = table[start][i];
path[i] = (table[start][i]==INT)?-1:start;
final[i] = false;
}
dist[start] = 0;
final[start] = true;
path[start] = -1;
for(int i=0;i<7;i++) {
printf("%d\t%d\t%d\n",dist[i],final[i],path[i]);
}
for(int i=1;i<7;i++){
int To_final = min((int *)(&dist),(int *)(&final),7);
printf("To_final = %d\n",To_final);
final[To_final] = true;
for(int j=0;j<7;j++){
if(final[j]==false && (dist[To_final]+table[To_final][j] < dist [j])) {
dist[j] = dist[To_final] + table[To_final][j];
path[j] = To_final;
}
}
}
for(int i=0;i<7;i++) {
printf("%d\t%d\t%d\n",dist[i],final[i],path[i]);
}
printf("[%d]",end);
while(path[end] != -1){
printf("<-[%d]",path[end]);
end = path[end];
}
return 0;
}
int min(int *dist,int *final,int num){
int index;
int min = 2*INT;
int cnt=0;
// printf("%d\n",dist[2]);
do{
if(dist[cnt]<min && final[cnt] == false) {
min = dist[cnt];
// printf("min = %d\n",min);
index = cnt;
// printf("index = %d\n",index);
}
cnt++;
}while(cnt<num);
// printf("%d\n",index);
return index;
}
//
//void table_init(int *p_table, int width) {
// for (int i = 0; i < width; i++) {
// for (int j = 0; j < width; j++) {
// p_table[i * width + j] = INT;
// }
// }
//}
//
//void table_show(int *p_table, int width) {
// for (int i = 0; i < width; i++) {
// for (int j = 0; j < width; j++) {
// printf("%d\t", p_table[i * width + j]);
// }
// printf("\n");
// }
//}
附上结果
思路是这个B站视频的思路,但是我的代码实现并不是那么灵活,草草写出来了,相信肯定有更加好的实现方法,仅供参考
改进方向:可以从任何点出发,任何点结束。
注:如有侵权问题,邮箱:1093666482@qq.com