一、算法过程
二、算法实现
#include <iostream>
const int kNum
= 100;
const int kMax
= INT32_MAX
;
typedef struct Graph
{
char vertex
[kNum
];
int vertex_count
;
int matrix
[kNum
][kNum
];
}Graph
;
void Dijkstra(Graph g
, int source
, int *previous
, int *distance
) {
int next
;
int min
;
int tmp
;
int flag
[kNum
];
for (int i
= 0; i
< g
.vertex_count
; i
++) {
flag
[i
] = 0;
previous
[i
] = 0;
distance
[i
] = g
.matrix
[source
][i
];
}
flag
[source
] = 1;
distance
[source
] = 0;
for (int i
= 1; i
< g
.vertex_count
; i
++) {
min
= kMax
;
for (int j
= 0; j
< g
.vertex_count
; j
++) {
if (flag
[j
]==0 && distance
[j
]<min
) {
min
= distance
[j
];
next
= j
;
}
}
flag
[next
] = 1;
for (int j
= 0; j
< g
.vertex_count
; j
++)
{
tmp
= (g
.matrix
[next
][j
]==kMax
? kMax
: (min
+ g
.matrix
[next
][j
]));
if (flag
[j
] == 0 && (tmp
< distance
[j
]) )
{
distance
[j
] = tmp
;
previous
[j
] = next
;
}
}
}
printf("从顶点(%c)到其它顶点的最短路径: \n", g
.vertex
[source
]);
for (int i
= 0; i
< g
.vertex_count
; i
++)
printf("\tshortest(%c, %c)=%d\n", g
.vertex
[source
], g
.vertex
[i
], distance
[i
]);
}
int main
() {
int previous
[kNum
];
int distance
[kNum
];
Dijkstra(Graph
{ "ABCDEFG", 7,
{ {0, 12, kMax
, kMax
, kMax
, kMax
, 14},
{12, 0, 10, kMax
, kMax
, 7, kMax
},
{kMax
, 10, 0, 3, 5, 6, kMax
},
{kMax
, kMax
, 3, 0, 4, kMax
, kMax
},
{kMax
, kMax
, 5, 4, 0, 2, 8 },
{16, 7, 6, kMax
, 2, 0, 9 },
{16, 7, 6, kMax
, 2, 0, 9 }} }, 3, previous
, distance
);
return 0;
}
转载请注明原文地址: https://mac.8miu.com/read-496064.html