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
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/jiejiexiao/article/details/79207719
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。