创建一个带权路径的 有向图,无向图,输出从v0到其他各个顶点的最短路径采用Dijstra算法求一个顶点到其他所有顶点的最短路径

创建一个带权路径的 有向图,无向图,
输出从v0到其他各个顶点的最短路径
采用Dijstra算法求一个顶点到其他所有顶点的最短路径 

Dijstra code:

/*
创建一个带权路径的 有向图,无向图,
输出从v0到其他各个顶点的最短路径
采用Dijstra算法求一个顶点到其他所有顶点的最短路径 

*/
#define N 1 << 12 //4096,这里代替无穷大(默认 邻接矩阵) 
#define size 6
#include <stdio.h>

//cost为带权有向图的邻接矩阵,v为指定的 源点(从那个点开始) 
void dijstra(int cost[size][size],int v);

int main()
{
	//测试 邻接矩阵(用邻接矩阵 表示图)
	//这里用 有向图测试,无向图 类似 不过邻接矩阵必须关于对角线对称
	int a[size][size] = 
	{
		N ,N ,10,N ,30,100,
		N ,N ,5 ,N ,N ,N  ,
		N ,N ,N ,50,N ,N  ,
		N ,N ,N ,N ,N ,10 ,
		N ,N ,N ,20,N ,60 ,
		N ,N ,N ,N ,N ,N  ,
	};
	//参数 带权有向图的邻接矩阵,v为指定的 源点(从那个点开始)
	dijstra(a,0);//V0 ~ V(size - 1),一共 size个顶点 
	
	return 0;
}
//cost为带权有向图的邻接矩阵,v为指定的 源点(从那个点开始) 
void dijstra(int cost[size][size],int v)
{
	printf("源点是%d\n",v);
	int dist[size],s[size],rear[size];//dist[i]当前源点到顶点i的最小距离,s表示并入集合标识 
	int q[size][size]; 
	
	int i,j,k,mmin,m;
	//初始化s和rear 
	for(i = 0;i < size;i ++)
	{
		s[i] = 0;
		rear[i] = -1;
	}
	//初始化 dist和q
	for(i = 0;i < size;i ++)
	{
		dist[i] = cost[v][i];
		
		if(dist[i] < N)
		{
			q[i][++ rear[i]] = v;
			q[i][++ rear[i]] = i;
		}
	}
	
	s[v] = 1;//v并入 集合 
	
	//源点以及并入,再并入 size - 1个结点 
	for(k = 0;k < size - 1;k ++)
	{
		mmin = N;j = v;
		for(i = 0;i < size;i ++)//选出最小的dist[j] 
		{
			if(s[i] == 0 && dist[i] < mmin)//如果标识为0(没有被处理),且有到 i 的 路径 
			{
				j = i; //待处理index 赋值为i 
				mmin = dist[i];//更新 dist   
			}
		}
		if(j != i)
		{
			s[j] = 1;//处理后标识 为 1,避免重复处理 

						
			if(dist[j] == N)//dist[j] 等于无穷大,说明 没有到达该 点的路径,剔除源点到其 没有路径的index 
			{
				break;
			}
			
			printf("\nthe %d shortestdistance is %d\n",j,dist[j]);

			for(i = 0;i <= rear[j];i ++)//查看 path 
			{
				printf("-->%d",q[j][i]);//打印从源点到j的最短路径 
			}
			
			for(i = 0;i < size;i ++)//修改从源点到其余各店的最短距离 
			{
				if( s[i] == 0 && ( (dist[j] + cost[j][i]) < dist[i] ) )
				{
					dist[i] = dist[j] + cost[j][i];    //更新源点 到每个点的 最短路径 
					for(m = 0;m <= rear[j];m ++)
					{
						q[i][m] = q[j][m]; //修改相应的路径 
					}
				
					rear[i] = rear[j];
					q[i][++ rear[i]] = i;
				}
				
				
			}
		}
		
	}
	
	return;
}

result:

猜你喜欢

转载自blog.csdn.net/qq_47991812/article/details/121440091
今日推荐