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)算法详解