迪杰斯特拉算法及变式(最短距离,打印路径,最短经过节点数)

该博客详细介绍了迪杰斯特拉算法用于求解有权单源图的最短路径问题,包括如何处理最短距离、打印路径以及计算最短路径的条数。通过代码模板和拓展问题的讨论,解释了算法的应用和变式,特别是如何找到经过节点数最少的最短路径。
摘要由CSDN通过智能技术生成

问题描述

给定一个图,图的节点名称用( 0 0 0 ~ N − 1 N - 1 N1)表示。 N N N为图的节点个数, M M M为边的个数, S S S为起始点。

输入条件:
第一行输入 N M S N M S NMS
其后 M M M行,每行输入三个数,分别代表源节点目标节点边的距离

输出条件:
请输出 S S S到所有点的最短距离,并打印出每一步经过的节点名称(中间以空格隔开)。

测试样例:

输入:
4 5 0
0 1 1
1 3 2
0 3 4
0 2 2
2 3 1

输出:
从 0 到 0 的最短距离是:0
所经过的路径是:
0 
-----------------------------------
从 0 到 1 的最短距离是:1
所经过的路径是:
0 1 
-----------------------------------
从 0 到 2 的最短距离是:2
所经过的路径是:
0 2 
-----------------------------------
从 0 到 3 的最短距离是:3
所经过的路径是:
0 1 3 
-----------------------------------

输入:
5 8 0
0 1 10
0 3 20
0 4 100
1 2 10
2 4 10
3 2 10
3 4 10
1 4 20

输出:
从 0 到 0 的最短距离是:0
所经过的路径是:
0 
-----------------------------------
从 0 到 1 的最短距离是:10
所经过的路径是:
0 1 
-----------------------------------
从 0 到 2 的最短距离是:20
所经过的路径是:
0 1 2 
-----------------------------------
从 0 到 3 的最短距离是:20
所经过的路径是:
0 3 
-----------------------------------
从 0 到 4 的最短距离是:30
所经过的路径是:
0 1 4 
-----------------------------------

算法就不介绍了,慕课浙大数据结构讲的很好。
迪杰斯特拉算法能处理有权单源图的最短路径问题(边权重不能有负值)。

代码思路

  1. 建立邻接数组(邻接链表),并根据已知数据填充数组。
  2. 根据题目需求,建立checked数组、dist数组、path数组、count数组来分别保存节点是否被访问过、最短距离、上一跳、路线个数。并对这些数组做初始化。
  3. 进入大循环,找到一个未处理过,而且具有最小边的节点idist[i]最小)。

    可以通过小顶堆来维护最小的边,也能直接遍历所有节点找出最小边。

  4. 如果找不到,说明图已经处理完了,直接退出。
  5. 如果找到了,将check[i]设为已访问。并访问其相邻节点。
  6. 遍历相邻节点j时,如果从起始点到i,再从ij的距离比直接从起始点到j的距离短的话,更新起始点到j的距离,并将j的上一跳设置为i
  7. 最后得到的dist数组,保存了起始点到所有点的最短距离。path数组保存了从起始点到所有点最短路径的上一跳。根据题目要求输出即可。

代码模板

import java.util.Arrays;
import java.util.Scanner;

/**
 * @Auther: Erekilu
 * @Date: 2020-06-04
 */
public class Dijkstra
{
   
	private static final int MAX = 0x3f3f3f3f;

	public static void main(String[] args)
	{
   
		Scanner in = new Scanner(System.in);
		int count = in.nextInt();
		int number = in.nextInt();
		int source = in.nextInt();
		int[][] line = new int[number][3];
		for (int i = 0 ; i < number ; i++)
		{
   
			line[i][0] = in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值