现在的问题是,路已经修好了,我从原点O出发,怎么知道到达其它各点的距离最短。比如从O点去D点,有的同学马上就会说,很显然O->A->D的距离是最短的。因为点很少,线路也不多,说以你能一眼看出来。而且你能一眼看出来,是因为在你的大脑迅速的运算,比较之后得出的结论。
要让计算机或者机器去做,就必须给它一个算法,让它知道怎么走?先从简单的开始,讨论O到A和B两个点的最短距离。一个直观的想法是,从O出发,先找到距离O点最短的点A,再从O点或者A点出发到达B点,比较从O->A->B和O->B谁更短一些。于是Dijkstra算法应运而生。
//注:999表示此路不通
#include<stdio.h>
#include<math.h>
#define INF 999
//定义点数据类型
struct Point
{
int x,y;
};
//定义六个点并初始化
struct Point point[5]={{0,0},{1,1},{2,1},{3,2},{2,3}};
//定义邻接矩阵map
double map[6][6];
//定义已访问点集到未访问点集的距离,初始化为出发点到其它各点的距离
double dist[6];
//定义数组,表示某个点是否被访问
int visited[6];
double getLength(struct Point A,struct Point B)
{
return (double)sqrt(pow((A.x-B.x),2)+pow((A.y-B.y),2));
}
void initMap()
{
int i,j;
for(i=0;i<6;i++)
for(j=0;j<6;j++)
{ map[i][j]=INF;
if(i==j) map[i][j]=0;
}
map[0][1]=map[1][0]=getLength(point[0],point[1]);
map[0][2]=map[2][0]=getLength(point[0],point[2]);
map[1][2]=map[2][1]=getLength(point[1],point[2]);
map[1][4]=map[4][1]=getLength(point[1],point[4]);
map[2][3]=map[3][2]=getLength(point[2],point[3]);
map[3][4]=map[4][3]=getLength(point[3],point[4]);
}
void initDist()
{
int i;
for(i=0;i<5;i++)
dist[i]=map[0][i]; //dist[]初始化为起点到各点的距离
}
void printPoint()
{
int i;
for(i=0;i<5;i++)
printf("%c:(%d,%d) ",'A'+i-1,point[i].x,point[i].y);
}
void printMap()
{
int i,j;
for(i=0;i<5;i++)
{ for(j=0;j<5;j++)
printf("%6.2f ",map[i][j]);
printf("\n");
}
}
void printDist()
{
int i;
for(i=0;i<5;i++)
printf("%6.2f ",dist[i]);
}
void dijkstra()
{
int i,j,min,pos,max;
visited[1]=1;
for(i=0;i<5;i++)
{
min=INF;
for(j=0;j<5;j++)
{
if(!visited[j] && dist[j]<min) //找到一个距离源点最近的节点
{
pos=j;
min=dist[j];
}
}
if(min==INF) break; //如果min==INF表示源点到其它节点都不可达
visited[pos]=1;
for(j=0;j<5;j++)
{
if(!visited[j] && dist[pos]+map[pos][j]<dist[j])
dist[j]=dist[pos]+map[pos][j];
}
}
}
void main()
{
printPoint();
printf("\n");
initMap();
printf("Adjacency matrix is as follows:\n");
printMap();
initDist();
printf("the initial dist[] is as follow:\n");
printDist();
printf("\n");
dijkstra();
printf("Now finding point O the other point's shortest distance...\n");
printf("The result is as follow:\n");
printDist();
}
运行结果: