数据结构--6.0最短路径

目录

一、迪杰斯特拉算法(Dijkstra)

二、弗洛伊德算法(Floyd)


在网图和非网图中,最短路径的含义是不同的。

------网图是两顶点经过的边上的权值之和最少的路径。

------非网图是两顶点之间经过的边数最少的路径。

我们把路径起始的第一个顶点称为源头,最后一个顶点称为终点。

关于最短路径的算法:

1、迪杰斯特拉算法(Dijkstra)

2、弗洛伊德算法(Floyd)

一、迪杰斯特拉算法(Dijkstra)

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

#define MAXVEX 9
#define INFINITY 65536

typedef int Patharc[MAXVEX];				//用于存储最短路径下标的数组 
typedef int ShortPathTable[MAXVEX];			//用于存储到各点最短路径的权值 

void ShortestPath_Dijkstra(MGraph G , int V0,Patharc *p,ShortPathTable *D)
{
	int v,w,k,min;
	int final[MAXVEX];						//final[w]=1 表示已经求得顶点v0到vw的最短路径 
	
	//初始化数据 
	for(v=0;v<G.numVertexes; v++)
	{
		final[v] = 0;						//全部顶点初始化为未找到最短路径 
		(*D)[v] = G.arc{V0}[v];				//将与v0点有连接线的顶点加上权值 
		(*p)[v] = 0;						//初始化路径数组p为0 
	}
	(*D)[V0] = 0;					//v0至v0的路径为0 
	final[v0] = 1;					//v0至v0不需要求路径 
	
	//开始主循环,每次求得v0到某个v顶点的最短路径 
	for(v=1;v<G.numVertexes;v++)
	{
		min = INFINITY;
		for(w =0; w<G.numVertexes; v++)
		{
			if(!final[w]&&(*D)[w]<min)
			{
				k = w;
				min = (*D)[w];	
			}	
		} 
		final[k] = 1;//将目前找到的最短路径置1 
		
		//修正当前最短路径及距离 
		for(w=0; w<G.numVextexes;w++)
		{
			//如果经过v顶点的路径比现在这条路径的长度短的话,更新! 
			if( !final[w]&&(min+G.arc[k][w] < (*D)[w]))
			{
				(*D)[w] = min + G.arc[k][w];		//修改当前路径长度 
				(*p)[w] = k;						//存放前驱顶点 
			}
		} 
	}
}
 

二、弗洛伊德算法(Floyd)

弗洛伊德算法非常简洁优雅。

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

#define MAXVEX 9
#define INFINITY 65536

typedef int Pathmatirx[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];

void ShortestPath_Floyd(MGraph.G,Pathmatirx *p,ShortPathTable *D)
{
	int v,w,k;
	//初始化  D  和   p 
	for(v=0;v<G.numVertexes;w++)
	{
		for(w=0;w<G.numVertexes;w++)
		{
			(*D)[v][w] = G.matirx[v][m];
			(*p)[v][w] = w;
		}
	}
	//弗洛伊德算法 
	for(k=0;k<G.numVertexes;k++)
	{
		for(v=0;v<G.numVertexes;v++)
		{
			for(w=0;w<G.numVertexes;w++)
			{
				if((*D)[v][w] > ((*D)[v][k] + (*D)[k][w]))
				{
					(*D)[v][w] = (*D)[v][k] + (*D)[k][w];
					(*p)[v][w] = (*p)[v][k];
				}
			}
		}
	}
} 
相关推荐
草莓啵啵~21 分钟前
数据结构--二叉树
数据结构
Watink Cpper36 分钟前
[数据结构高阶]并查集初识、手撕、可以解决哪类问题?
数据结构·图论··并查集
不是吧这都有重名1 小时前
[论文阅读]Deeply-Supervised Nets
论文阅读·人工智能·算法·大语言模型
homelook1 小时前
matlab simulink双边反激式变压器锂离子电池均衡系统,双目标均衡策略,仿真模型,提高均衡速度38%
算法
什码情况2 小时前
星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)
java·数据结构·算法·华为od·面试·机试
天上路人2 小时前
采用AI神经网络降噪算法的通信语音降噪(ENC)模组性能测试和应用
人工智能·神经网络·算法
字节高级特工2 小时前
【C++】”如虎添翼“:模板初阶
java·c语言·前端·javascript·c++·学习·算法
.Vcoistnt2 小时前
Codeforces Round 1024 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划·图论
晴天下小雨o2 小时前
排序算法总结
java·算法·排序算法
程序员爱钓鱼2 小时前
循环语句:for、range -《Go语言实战指南》
java·数据结构·算法