BFS- 最小生成树(Dijkstra最短路径拓展)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS- 最小生成树(Dijkstra最短路径拓展)相关的知识,希望对你有一定的参考价值。

题目描述

给定一张连通图,求1到 n 的最小生成树。
在这里插入图片描述
两点间权值 为1。
输入:n个点,标号1-n,m条无向边。

算法分析

  • 考虑使用哪种数据结构存储图信息
  • 巧妙的方法是:使用集合数组,数组下标对应不同点,每一个点集合中存储与该点相连通的点下标。
  • BFS 从点 1 开始遍历,整张图
  • 为了避免出现回路,设置数组 visited[n+1]:下标 i 代表,点 i 是否被访问过。
  • 设置数组 dis[n+1]:下标 i 代表点 1 到 点 i 的距离。

代码实现

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();

        // 创建集合数组对象,数组下标对应 node, 集合对象存储的是:点与点的关系
        ArrayList<Integer>[] graph = new ArrayList[n+1];
        // 初始化集合数组的每一个对象
        for (int i = 0; i <= n; i++) {
            graph[i] = new ArrayList<>();
        }

        // 获取键盘输入
        int from, to;
        for (int i = 0; i < m; i++) {
            from = sc.nextInt();
            to = sc.nextInt();
            // 无向图需要双向添加关系
            graph[from].add(to);
            graph[to].add(from);
        }

        // 创建访问数组,默认是 0代表该下标对应结点未访问。
        int[] visited = new int[n+1];
        // 创建距离数组,下标代表 1到 index 的距离
        int[] dis = new int[n+1];

        // 使用广度优先遍历,队列先进先出
        Queue<Integer> queue = new LinkedList<>();

        // 将首结点添加,并做标记
        queue.offer(1);
        visited[1] = 1;

        while (!queue.isEmpty()) {
            int node = queue.poll();
            for (int next : graph[node]) {
                // 如果当前结点的下一个连接点,访问过就跳过
                if (visited[next] == 1) continue;
                // 修改当前点1 到 当前点的距离
                dis[next] = dis[node] + 1;
                // 修改标志位
                visited[next] = 1;
                // 将该点加入队列
                queue.offer(next);
            }
        }
        System.out.println(dis[n]);
    }
}

类似的图论题目有很多,需要根据实际情况进行灵活变通,熟能生巧。
加油!

以上是关于BFS- 最小生成树(Dijkstra最短路径拓展)的主要内容,如果未能解决你的问题,请参考以下文章

最小生成树(Prim,Kruskal)--最短路径(Dijkstra,Floyd)算法详解

最小生成树(Prim,Kruskal)--最短路径(Dijkstra,Floyd)算法详解

最小生成树(Prim,Kruskal)--最短路径(Dijkstra,Floyd)算法详解

图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)

提高篇:图的最短路径算法和最小生成树算法

图解迪杰斯特拉(Dijkstra)最短路径算法