Problem B: 算法7-15:迪杰斯特拉最短路径算法

74 篇文章 14 订阅
35 篇文章 2 订阅

Problem Description

在带权有向图G中,给定一个源点v,求从v到G中的其余各顶点的最短路径问题,叫做单源点的最短路径问题。

在常用的单源点最短路径算法中,迪杰斯特拉算法是最为常用的一种,是一种按照路径长度递增的次序产生最短路径的算法。

可将迪杰斯特拉算法描述如下:

 在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并按照以上描述中的算法求出源点至每一个其它顶点的最短路径长度。

 

 Input Description

 

输入的第一行包含2个正整数n和s,表示图中共有n个顶点,且源点为s。其中n不超过50,s小于n。

以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。

 

 Output Description

 

只有一行,共有n-1个整数,表示源点至其它每一个顶点的最短路径长度。如果不存在从源点至相应顶点的路径,输出-1。

请注意行尾输出换行。

Sample Input

4 1
0 3 0 1
0 0 4 0
2 0 0 0
0 0 1 0

 Sample Output

6 4 7 

 Hint

在本题中,需要按照题目描述中的算法完成迪杰斯特拉算法,并在计算最短路径的过程中将每个顶点是否可达记录下来,直到求出每个可达顶点的最短路径之后,算法才能够结束。

迪杰斯特拉算法的特点是按照路径长度递增的顺序,依次添加下一条长度最短的边,从而不断构造出相应顶点的最短路径。

另外需要注意的是,在本题中为了更方便的表示顶点间的不可达状态,可以使用一个十分大的值作为标记。

 我的想法:

 我的代码:

#include <iostream>
using namespace std;
#define  MAX 50
#define INF 99999999

int n, s;
int str[MAX][MAX];
int longth[MAX];
bool visited[MAX];


int main()
{
	cin >> n >> s;
	//初始化数组
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			scanf("%d", &str[i][j]);
		}
		visited[i] = false;
	}

	//将第s行数组的数据装到longth中表示s到各个顶点之间的距离
	for (int i = 0; i < n; i++)
	{
		longth[i] = str[s][i];
		if (longth[i] == 0 &&  i != s)
		{
			longth[i] = INF;
		}
	}
	//s访问了
	visited[s] = true;

	int min;
	int v;
	v = s;
	for (int i = 0; i < n; i++)
	{
		min = INF;
		//寻找最小的那个值
		for (int j = 0; j < n; j++)
		{
			if (min > longth[j] && visited[j] == false)
			{
				min = longth[j];
				v = j;
			}
		}
		visited[v] = true;

		for (int j = 0; j < n; j++)
		{
			if (visited[j] == false && longth[j] > str[v][j] + longth[v] && str[v][j] != 0)
			{
				longth[j] = str[v][j] + longth[v];
			}
		}

		/*for (int j = 0; j < n; j++)
		{

			cout << longth[j] << " ";
		}
		cout << endl;*/
	
	}

	for (int i = 0; i < n; i++)
	{
		if (i != s)
		{
			
			if (longth[i] == INF)
			{
				cout << -1 << " ";
			}
			else
			{
				cout << longth[i] << " ";
			}
		}
	}
	cout << endl;





	return 0;
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 迪杰斯特拉最短路径算法是一种用于解决带权有向图中单源最短路径问题算法。该算法的基本思想是:从源点开始,依次确定到各个顶点的最短路径,直到所有顶点的最短路径都被确定。 具体实现过程如下: 1. 初始化:将源点到各个顶点的距离都设为无穷大,将源点到自身的距离设为。 2. 选择当前距离源点最近的未确定最短路径的顶点,将其标记为已确定最 ### 回答2: 迪杰斯特拉最短路径算法(Dijkstra's shortest path algorithm)是解决带权有向图或无向图中,从起点到终点的最短路径问题的经典算法之一。 该算法使用了贪心思想,每次从尚未确定最短路径的节点中选取一条距离起点最近的节点,通过该节点重新更新起点到其它未确定最短路径节点的距离,直到所有节点的最短路径都被确定。 具体实现如下: 1. 初始化:起点到自身的距离为0,其余节点的距离为无穷大。 2. 选择当前可到达且距离起点最近的节点,标记该节点为确定最短路径节点。 3. 更新该节点的邻居节点的距离,若经过当前节点到某个邻居节点的距离比已有距离短,则更新距离。 4. 重复2、3步骤,直到所有节点的最短路径都被确定。 在实际应用中,可以使用优先队列或堆等数据结构来优化算法实现,以提升算法效率。同时,该算法也具有一定的局限性,如不能处理存在负边权的图问题,需要使用另外的算法来解决。 总之,迪杰斯特拉最短路径算法是解决最短路径问题的高效算法之一,在实际应用中具有广泛的应用价值。 ### 回答3: 迪杰斯特拉最短路径算法是一种用于解决带有加权边的最短路径问题算法。该算法的主要思想是从起点开始,通过计算所有节点到起点的距离,并选择距离最短的节点进行扩展。在扩展的过程中,更新已知的最短路径以及每个节点的父节点指向,直到扩展到终点节点或所有节点都被扩展为止。 在算法的实现过程中,首先需要将所有节点的距离初始化为无穷大,并将起点的距离设置为0。然后,将起点加入到一个未访问节点的集合中,并将其标记为已访问。接着,根据起点节点的邻居节点,更新它们的距离和父节点指向,并将它们加入到未访问节点的集合中。之后,从未访问节点的集合中选择距离最短的节点进行扩展,并重复之前的步骤,直到终点节点被扩展或所有节点都被扩展为止。 迪杰斯特拉最短路径算法的时间复杂度为O(n^2),其中n为节点的数量。在实际应用中,该算法也可以通过采用优先队列等数据结构来优化,从而达到更好的时间复杂度。 总之,迪杰斯特拉最短路径算法在现代计算机科学中应用广泛。它可以用于建立地图应用、路由算法、网络流量控制以及许多其他应用领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小木苓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值