• 基于邻接矩阵的广度优先遍历


    一 需要创建的图

    二 代码

    1. package graph;
    2. import java.util.LinkedList;
    3. import java.util.Queue;
    4. import java.util.Scanner;
    5. public class BFSAM {
    6. static final int MaxVnum = 100; // 顶点数最大值
    7. // 访问标志数组,其初值为"false"
    8. static Boolean visited[] = new Boolean[MaxVnum];
    9. static {
    10. for (int i = 0; i < visited.length; i++) {
    11. visited[i] = false;
    12. }
    13. }
    14. static int locatevex(BFSAM.AMGraph G, char x) {
    15. for (int i = 0; i < G.vexnum; i++) // 查找顶点信息的下标
    16. if (x == G.Vex[i])
    17. return i;
    18. return -1; // 没找到
    19. }
    20. static void CreateAMGraph(BFSAM.AMGraph G) {
    21. Scanner scanner = new Scanner(System.in);
    22. int i, j;
    23. char u, v;
    24. System.out.println("请输入顶点数:");
    25. G.vexnum = scanner.nextInt();
    26. System.out.println("请输入边数:");
    27. G.edgenum = scanner.nextInt();
    28. System.out.println("请输入顶点信息:");
    29. // 输入顶点信息,存入顶点信息数组
    30. for (int k = 0; k < G.vexnum; k++) {
    31. G.Vex[k] = scanner.next().charAt(0);
    32. }
    33. //初始化邻接矩阵所有值为0,如果是网,则初始化邻接矩阵为无穷大
    34. for (int m = 0; m < G.vexnum; m++)
    35. for (int n = 0; n < G.vexnum; n++)
    36. G.Edge[m][n] = 0;
    37. System.out.println("请输入每条边依附的两个顶点:");
    38. while (G.edgenum-- > 0) {
    39. u = scanner.next().charAt(0);
    40. v = scanner.next().charAt(0);
    41. i = locatevex(G, u);// 查找顶点 u 的存储下标
    42. j = locatevex(G, v);// 查找顶点 v 的存储下标
    43. if (i != -1 && j != -1)
    44. G.Edge[i][j] = 1; //邻接矩阵储置1
    45. else {
    46. System.out.println("输入顶点信息错!请重新输入!");
    47. G.edgenum++; // 本次输入不算
    48. }
    49. }
    50. }
    51. static void print(BFSAM.AMGraph G) { // 输出邻接矩阵
    52. System.out.println("图的邻接矩阵为:");
    53. for (int i = 0; i < G.vexnum; i++) {
    54. for (int j = 0; j < G.vexnum; j++)
    55. System.out.print(G.Edge[i][j] + "\t");
    56. System.out.println();
    57. }
    58. }
    59. // 基于邻接矩阵的广度优先遍历
    60. static void BFS_AM(AMGraph G, int v) {
    61. int u, w;
    62. // 创建一个普通队列(先进先出),里面存放int类型
    63. Queue<Integer> Q = new LinkedList<>();
    64. System.out.println(G.Vex[v] + "\t");
    65. visited[v] = true;
    66. Q.add(v); // 源点 v 入队
    67. while (!Q.isEmpty()) { //如果队列不空
    68. u = Q.peek(); // 取出队头元素赋值给u
    69. Q.poll(); // 队头元素出队
    70. for (w = 0; w < G.vexnum; w++) {// 依次检查 u 的所有邻接点
    71. if (G.Edge[u][w] == 1 && !visited[w]) { // u、w 邻接而且 w 未被访问
    72. System.out.println(G.Vex[w] + "\t");
    73. visited[w] = true;
    74. Q.add(w);
    75. }
    76. }
    77. }
    78. }
    79. public static void main(String[] args) {
    80. int v;
    81. char c;
    82. AMGraph G = new BFSAM.AMGraph();
    83. CreateAMGraph(G);
    84. print(G);
    85. System.out.println("请输入遍历图的起始点:");
    86. Scanner scanner = new Scanner(System.in);
    87. c = scanner.next().charAt(0);
    88. v = locatevex(G, c); // 查找顶点u的存储下标
    89. if (v != -1) {
    90. System.out.println("广度优先搜索遍历图结果:");
    91. BFS_AM(G, v);
    92. } else
    93. System.out.println("输入顶点信息错!请重新输入!");
    94. }
    95. static class AMGraph {
    96. char Vex[] = new char[CreateAMGraph.MaxVnum];
    97. int Edge[][] = new int[CreateAMGraph.MaxVnum][CreateAMGraph.MaxVnum];
    98. int vexnum; // 顶点数
    99. int edgenum; // 边数
    100. }
    101. }

    三 测试

     

     

  • 相关阅读:
    1688图片搜索商品接口(以图搜索商品接口)代码对接教程
    科普读书会丨《被讨厌的勇气》:愤怒不是目的,是一种工具
    【Spring进阶系列丨第一篇】初识Spring开发
    Autosar诊断实战系列19-UDS单帧数据接收代码逻辑分析
    全国统计专业技术初级资格考试大纲(2021年)
    2023年【司钻(钻井)】及司钻(钻井)作业模拟考试
    IDEA—java: 常量字符串过长问题解决
    SSD程序
    php 获取音频时长等信息
    pip使用豆瓣镜像源
  • 原文地址:https://blog.csdn.net/chengqiuming/article/details/125456900