dijkstra algorithm example

现在的问题是,路已经修好了,我从原点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();
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值