图的遍历--广度优先遍历

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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞