package com.xjj.Ah;
import java.util.LinkedList;
import java.util.Scanner;
/*------图的遍历--广度优先遍历-----
* 1.首先以一个未访问的顶点为起点(进队列),访问其所有有边的顶点(出队)...在以该顶点为起点...
*
* 2. 基本模型
* void bfs(int start)
* {
* 标记(已经遍历)该点;
* 入队;
* while(队列不为空)
* {
* 更换新的起始点;
* 对所有节点访问(for){
* 如果满足条件(有边且未标记){
* 入队;
* 标记已经遍历;
* }
* 如果所有节点遍历完即退出(break);
* }
* 移除头节点;
* }
* }
*
* */
public class Ah_5_2 {
static int N = 0, M = 0; //点,边 行坐标代表该点,列坐标代表其对其他点
static int[][] a = new int[51][51]; //保存图,点边集
static int[] book = new int[51]; //因为只涉及到点就行,故一维数组
static int sum = 0;
//广度访问点入队
LinkedList<Integer> list = new LinkedList<>();
//广度优先遍历
public void bfs(int start){
sum++;
list.add(start); //入队
book[start] = 1; //标记该点已经遍历
while(!list.isEmpty()){ //直到队列为空
start = list.getFirst(); //改变起始顶点
for(int i = 1; i <= N; i++){ //对所有节点遍历
//如果有边且未遍历
if (a[start][i] == 1 && book[i] == 0) {
sum++;
list.add(i);
book[i] = 1;
}
//如果所有节点已经遍历完
if (sum == N)
break;
}
System.out.print(list.getFirst() + " ");
//重要,移除头节点,改变新的起始节点
list.remove();
}
}
public static void main(String[] args) {
System.out.println("输入图的顶点数及边数:");
Scanner scanner = new Scanner(System.in);
N = scanner.nextInt();
M = scanner.nextInt();
for(int i = 1; i <= M; i++){
int x = scanner.nextInt();
int y = scanner.nextInt();
a[x][y] = 1;
a[y][x] = 1;
}
Ah_5_2 ah = new Ah_5_2();
ah.bfs(1);
}
}
图的遍历--广度优先遍历
原文作者:数据结构之图
原文地址: https://blog.csdn.net/jiejiexiao/article/details/79205145
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/jiejiexiao/article/details/79205145
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。