基于邻接表的深度优先遍历

x33g5p2x  于2022-06-27 转载在 其他  
字(2.4k)|赞(0)|评价(0)|浏览(303)

一 要创建的图

二 代码

  1. package graph;
  2. import java.util.Scanner;
  3. public class DFSAL {
  4. static final int MaxVnum = 100; // 顶点数最大值
  5. // 访问标志数组,其初值为"false"
  6. static Boolean visited[] = new Boolean[MaxVnum];
  7. static {
  8. for (int i = 0; i < visited.length; i++) {
  9. visited[i] = false;
  10. }
  11. }
  12. static int locatevex(DFSAL.ALGraph G, char x) {
  13. for (int i = 0; i < G.vexnum; i++) // 查找顶点信息的下标
  14. if (x == G.Vex[i].data)
  15. return i;
  16. return -1; // 没找到
  17. }
  18. // 插入一条边
  19. static void insertedge(DFSAL.ALGraph G, int i, int j) {
  20. graph.AdjNode s = new graph.AdjNode();
  21. s.v = j;
  22. s.next = G.Vex[i].first;
  23. G.Vex[i].first = s;
  24. }
  25. // 创建有向图邻接表
  26. static void CreateALGraph(DFSAL.ALGraph G) {
  27. int i, j;
  28. char u, v;
  29. System.out.println("请输入顶点数和边数:");
  30. Scanner scanner = new Scanner(System.in);
  31. G.vexnum = scanner.nextInt();
  32. G.edgenum = scanner.nextInt();
  33. System.out.println("请输入顶点信息:");
  34. for (i = 0; i < G.vexnum; i++)//输入顶点信息,存入顶点信息数组
  35. G.Vex[i].data = scanner.next().charAt(0);
  36. for (i = 0; i < G.vexnum; i++)
  37. G.Vex[i].first = null;
  38. System.out.println("请依次输入每条边的两个顶点u,v");
  39. while (G.edgenum-- > 0) {
  40. u = scanner.next().charAt(0);
  41. v = scanner.next().charAt(0);
  42. i = locatevex(G, u); // 查找顶点 u 的存储下标
  43. j = locatevex(G, v); // 查找顶点 v 的存储下标
  44. if (i != -1 && j != -1)
  45. insertedge(G, i, j);
  46. else {
  47. System.out.println("输入顶点信息错!请重新输入!");
  48. G.edgenum++; // 本次输入不算
  49. }
  50. }
  51. }
  52. // 输出邻接表
  53. static void printg(DFSAL.ALGraph G) {
  54. System.out.println("----------邻接表如下:----------");
  55. for (int i = 0; i < G.vexnum; i++) {
  56. graph.AdjNode t = G.Vex[i].first;
  57. System.out.print(G.Vex[i].data + ": ");
  58. while (t != null) {
  59. System.out.print("[" + t.v + "]\t");
  60. t = t.next;
  61. }
  62. System.out.println();
  63. }
  64. }
  65. static void dfsAl(ALGraph G, int v) {//基于邻接表的深度优先遍历
  66. int w;
  67. graph.AdjNode p;
  68. System.out.println(G.Vex[v].data + "\t");
  69. visited[v] = true;
  70. p = G.Vex[v].first;
  71. // 依次检查 v 的所有邻接点
  72. while (p != null) {
  73. w = p.v; // w 为 v 的邻接点
  74. if (!visited[w]) // w 未被访问
  75. dfsAl(G, w);// 从 w 出发,递归深度优先遍历
  76. p = p.next;
  77. }
  78. }
  79. public static void main(String[] args) {
  80. DFSAL.ALGraph G = new DFSAL.ALGraph();
  81. for (int i = 0; i < G.Vex.length; i++) {
  82. G.Vex[i] = new graph.VexNode();
  83. }
  84. CreateALGraph(G); // 创建有向图邻接表
  85. printg(G); // 输出邻接表
  86. System.out.println("请输入遍历图的起始点:");
  87. Scanner scanner = new Scanner(System.in);
  88. char c = scanner.next().charAt(0);
  89. int v = locatevex(G, c);//查找顶点u的存储下标
  90. if (v != -1) {
  91. System.out.println("广度优先搜索遍历图结果:");
  92. dfsAl(G, v);
  93. } else
  94. System.out.println("输入顶点信息错!请重新输入!");
  95. }
  96. // 定义邻接点类型
  97. static class AdjNode {
  98. int v; // 邻接点下标
  99. graph.AdjNode next; // 指向下一个邻接点
  100. }
  101. // 定义顶点类型
  102. static class VexNode {
  103. char data; // VexType为顶点的数据类型,根据需要定义
  104. graph.AdjNode first; // 指向第一个邻接点
  105. }
  106. // 定义邻接表类型
  107. static class ALGraph {
  108. graph.VexNode Vex[] = new graph.VexNode[CreateALGraph.MaxVnum];
  109. int vexnum; // 顶点数
  110. int edgenum; // 边数
  111. }
  112. }

三 测试

相关文章