输入:1,4
输出:1,2,4,7,6,
代码拙劣 勿喷
网上抄来的dijikstra算法:
#include <stdio.h>
#define N 99999
#define MAX 8
void Dijkstra(int G[MAX][MAX],int S) {
int Dist[MAX] = {0};//存储结点到始发点的距离
int Known[MAX] = {0};//存储已确定最短路径的点
int Path[MAX] = {0};//存储走最短路径结点上一个点
//数组初始化
Known[S] = 1;
for (int i = 0; i < MAX; ++i)
{
Dist[i] = G[S][i];
if(G[S][i]!=N)
Path[i] = S;
}
int count = 1;
Path[S] = 0;
while (count < MAX - 1) {
//寻找当前dist中最小的加入known;
int V = 0;
for (int j = 1; j < MAX; ++j){
if (Dist[V] > Dist[j] && !Known[j])
V = j;
}
Known[V] = 1;//加入known
count++;
//更新与当前V相连点的距离
for (int i = 1; i < MAX; ++i) {
if (Dist[V] + G[V][i] < Dist[i] && !Known[i]) {
Dist[i] = Dist[V] + G[V][i];
Path[i] = V;
}
}
}
//此处更改终点
int p = 6;
while(p != 0 ){
printf("%d,",p);
p = Path[p];
}//自行倒序哈
}
int main() {
int d[MAX][MAX] = {
//{0,1,2,3,4,5,6,7};
{N,N,N,N,N,N,N,N},//0
{N,0,2,N,1,N,N,N},//1
{N,N,0,N,3,10,N,N},//2
{N,4,N,0,N,N,5,N},//3
{N,N,N,2,0,2,8,4},//4
{N,N,N,N,N,0,N,6},//5
{N,N,N,N,N,N,0,N},//6
{N,N,N,N,N,N,1,0},//7
};
//此处更改起始点
Dijkstra(d, 1);
return 0;
}
比较简短的Floyd算法:
#include <stdio.h>
#define N 1000
int main(){
int i,k,j;
int A[7][7]={
{N,2,N,1,N,N,N},//1
{N,N,N,3,10,N,N},//2
{4,N,N,N,N,5,N},//3
{N,N,2,N,2,8,4},//4
{N,N,N,N,N,N,6},//5
{N,N,N,N,N,N,N},//6
{N,N,N,N,N,1,N},//7
};
scanf("%d,%d",&i,&j);
A[i-1][j-1] = N;
int P[7][7],D[7][7];
for(i = 0; i < 7; i++){
for(k = 0; k < 7; k++){
D[i][k] = A[i][k];
P[i][k] = k;
}
}
for(j = 0; j < 7; j++){
for(i = 0 ; i < 7; i++){
for(k =0; k < 7; k++){
if(D[i][k] > (D[i][j] + D[j][k])){
D[i][k] = D[i][j] + D[j][k];
P[i][k] = P[i][j];
}
}
}
}
j = P[0][5];
printf("1,");
while(j != 5){
printf("%d,", j + 1);
j = P[j][5];
}
printf("6");
}```