广度遍历图--最少转机次数

package com.xjj.Ah;

import java.util.LinkedList;
import java.util.Scanner;

/*-----广度遍历图--最少转机次数-----
 * 1. 广度适用于权值相同的情形
 * 2. 涉及到某点到某点最短次数,用广度入队(同层步数相同)
 * 
 * */
public class Ah_5_3bfs {
	static int N = 0, M = 0;				//点,边		行坐标代表该点,列坐标代表其对其他点
	static int[][]	a = new int[51][51];	//保存图,点边集
	static int[] book = new int[51];		//因为只涉及到点就行,故一维数组
	//新对象入队
	class Dis{
		int x = 0;			//城市编号
		int step = 0;		//转机次数,精妙之处
	}
	
	Dis d = new Dis();
	LinkedList<Dis> list = new LinkedList<>();
	public void bfs(int start){
		int flag = 0;		//标记是否到达目标
		book[start] = 1;	//标记已经访问
		d.x = start;
		d.step =0;			//开始节点次数为0
		list.add(d);
		
		while(!list.isEmpty()){
			//更新新的起点
			start = list.getFirst().x;
			d = new Dis();
			//枚举遍历所有节点
			for(int i = 1; i <= N; i++){
				//如果有路径且未被遍历
				if (a[start][i] == 1 && book[i] == 0) {
					d.x = i;
					//该层步数等于上一层步数加1
					d.step = list.getFirst().step + 1;
					list.add(d);
					//如果到达目标则不用遍历且退出
					if (i==5){
						flag = 1;
						break;
					}
					book[i] = 1;
				}
			}
			
			if (flag == 1) {
				System.out.println("最少转机为: " + list.getLast().step);
				break;
			}
			//很重要,移除头结点才能继续往下扩展
			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_3bfs ah = new Ah_5_3bfs();
		ah.bfs(1);

	}

}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/jiejiexiao/article/details/79207719
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞