实习时候用 Object-Arx 在VC6上写的一个 Dijkstra 的 Cad 应用
实现的功能:按指定的要求随机生成线段,选取两个交叉点,计算两个交叉点的最短路径,并用红色标记最短路径
下载链接:http://pan.baidu.com/s/1hqpeQlm
简单的 C 语言设计思路
#include <stdio.h>
#include <stdlib.h>
typedef int bool;
const int MAX = 9999;
const int M = 5;
double Dijkstra(double map[M][M] , int n, int from, int dest) {
double * fromTo = (double*)malloc(n*sizeof(double));
for (int i=0; i<n; i++)
fromTo[i] = MAX;
bool * arrived = (bool*)malloc(n*sizeof(bool));
for (int i=0; i<n; i++)
arrived[i] = 0;
int * formerPos = (int*)malloc(n*sizeof(int));
double minDistance = 0;
int minIndex = from;
while(minIndex != dest) {
arrived[minIndex] = 1;
double min = MAX;
int index = 0;
for (int i=0; i<n; i++) {
if((arrived[i] == 0) && (minDistance + map[minIndex][i]<fromTo[i])) {
fromTo[i] = minDistance + map[minIndex][i];
if(min > fromTo[i]) {
min = fromTo[i];
formerPos[i] = minIndex;
index = i;
}
}
}
minIndex = index;
arrived[minIndex] = 1;
minDistance = min;
// 无法到达目的地
if(minDistance == MAX) break;
}
// 倒序输出路径
if(fromTo[dest] != MAX) {
printf("%d ", dest);
for(int pos=dest; pos!=from; pos=formerPos[pos]) {
printf("%d ", formerPos[pos]);
}
}
free(fromTo);
free(arrived);
return minDistance;
}
int main() {
double a[M][M] = {
{0, 1, MAX ,8, MAX},
{1, 0, 2 , MAX, MAX},
{MAX, 2, 0 , 3, 9},
{8, MAX,3 , 0, 4},
{MAX, MAX,9 , 4, 0}};
// 以 0 为起点 4 为终点,计算最短路径
printf("min distance: %lf\n", Dijkstra(a, M, 0, 4));
}