最短路径(C语言实现)

Dijkstra算法具体步骤:
(1)初始时,S集合只包含源点(S={v}),U集合包含剩余的点,源点v到自己的距离为0,到其他顶点的距离均为无穷大(表示不可达),以此更新dist[]数组,除dist[v]=0之外,其余全为无穷大;
(2)在dist[]数组中,找到目前在U集合中且使得源点v到其距离最小的顶点k,将该顶点加入U集合,并作为新的源点;
(3)根据新源点k,更新该源点到其他顶点的最小距离min{disk[i],dist[k]+A[k][i]},若距离被更新,对应的path[]数组也相应改变;
(4)不断重复步骤(2)、(3),直到所有顶点都在集合S中。

解释:
S集合 已经确定了到源点最小距离的顶点所在的集合
U集合 未确定最小距离的顶点所在的集合
dist[]数组 每一个点到源点的实时最小距离
path[]数组 每一个顶点的前驱顶点,初始为-1
A[][]数组 以邻接矩阵的形式存储图

实例以及代码

在这里插入图片描述

//定义一些全局变量
#define m 5201314
int A[7][7]={{m,4,6,6,m,m,m},
             {m,m,1,m,7,m,m},
             {m,m,m,m,6,4,m},
             {m,m,2,m,m,5,m},
             {m,m,m,m,m,m,6},
             {m,m,m,m,1,m,8},
             {m,m,m,m,m,m,m}};
int dist[7],path[7],mark[7]={0};
//初始化数组模块
void Initial(){
	int i;
	for(i=0;i<7;i++)
	{
		dist[i]=m;
		path[i]=-1;
	}
}
//寻找dist[]数组中距离最小的且在U中的顶点
int Min(){
	int l=0,i;
	while(mark[l]!=0)
		l++;
	for(i=0;i<7;i++)
		if(mark[i]==0&&dist[l]>dist[i])
			l=i;
	return l;
}
//不断地更新迭代模块
void Update(int start,int last){
	int number=0,k,i;
	k=start;
	dist[k]=0;
	number++;
	while(number<=7)      //终止条件
	{
		for(i=0;i<7;i++)  //整体dist[]更新一下
		{
			if(mark[i]==0)
			{
				if(dist[i]>dist[k]+A[k][i])  
				{//比较通过k点的距离和dist[]中的距离
					dist[i]=dist[k]+A[k][i];
					path[i]=k;
				}
			} 
	    }
		k=Min();
		number++;
		mark[k]=1;
	 }
}
//控制格式化输出
void Output(int start,int last){
	int k,i;
	int res[20],n=0;
	res[n++]=last;
	k=last;
	while(k!=start)
	{
		res[n++]=path[k];
		k=path[k];
	}
	printf("路径为:");
	for(i=n-1;i>=0;i--)
	{
		if(i==n-1)
			printf("%d",res[i]);
		else
			printf("->%d",res[i]);
	}
}
//主函数进行总体调用
int main(){
	int k,i,start,last;
	Initial();
	printf("起点:");
	scanf("%d",&start);
	printf("终点:");
	scanf("%d",&last);
	Update(start,last);
	Output(start,last);
	return 0;
}

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

原创文章 16 获赞 5 访问量 1004

猜你喜欢

转载自blog.csdn.net/qq_42453280/article/details/105976017
今日推荐