• java图(含java图的代码)


    目录

    一:图的介绍(要离散数学基础)

    二:图的表现形式

    2.1:邻接链表

    2.2:邻接矩阵

    三:图的遍历算法

    3.1 图的深度优先遍历算法​

    3.2 图的广度优先遍历算法

    3.3 全部代码


    一:图的介绍(要离散数学基础)

    我们先回顾一下之前介绍的树的概念,在树的定义中,每个节点只能有一个父类,并且树中不能出现有环形。但是你可曾想过,当一棵树没有任何规则的时候,会发生什么吗?
    现在,我们给图(graph)下一个定义:
    图,是一种用节点和边来表示相互关系的数学模型。(A graph is a mathematical structure for representing relationships using nodes and edges)
    其实,用句不是很严谨的话来说,图可以看成是没有任何限制的树(比如,可以有环状,可以有多种关系等等)。
    下图是图但它们不是一棵树:

    图没有固定的root结点


    图必须等待前面的任务完成之后,才可以执行下一个任务

    二:图的表现形式

    2.1:邻接链表

    查找比较浪费时间

    2.2:邻接矩阵

    比较浪费空间

    三:图的遍历算法

    3.1 图的深度优先遍历算法

    1. //孤立结点
    2. public void dfs() {
    3. for(int i = 0; i < al.size(); i++) {
    4. if(!is[i]) {
    5. dfs(is, i);
    6. }
    7. }
    8. }
    9. public void dfs(boolean[] b, int i) {
    10. System.out.print(al.get(i));
    11. is[i] = true;
    12. int w = firstNode(i);
    13. while(w != -1) {
    14. if(!is[i]) {
    15. dfs(b,w);
    16. }
    17. w = nextNode(i,w);
    18. }
    19. }

    3.2 图的广度优先遍历算法

    1. //广度
    2. public void bfs(boolean[] b,int i) {
    3. System.out.print(al.get(i));
    4. b[i] = true;
    5. //队列取头结点
    6. int u;
    7. //第一个领结点
    8. int w;
    9. LinkedList queue = new LinkedList();
    10. queue.addLast(i);
    11. while(!queue.isEmpty()) {
    12. u = (int) queue.removeFirst();
    13. w = firstNode(u);
    14. while(w != -1) {
    15. if(!is[w]) {
    16. System.out.print(al.get(w));
    17. is[w] = true;
    18. queue.addLast(w);
    19. }
    20. w = nextNode(u,w);
    21. }
    22. }
    23. }
    24. public void bfs() {
    25. for(int i = 0; i < al.size(); i++) {
    26. if(!is[i]) {
    27. bfs(is,i);
    28. }
    29. }
    30. }

    3.3 全部代码

    1. package graph;
    2. import java.util.ArrayList;
    3. import java.util.Arrays;
    4. import java.util.LinkedList;
    5. public class G {
    6. //集合
    7. private ArrayList al;
    8. //二维矩阵
    9. private int[][] array;
    10. //标记
    11. private boolean[] is;
    12. //边的个数
    13. private int num;
    14. public G(int num) {
    15. this.al = new ArrayList(num);
    16. this.array = new int[num][num];
    17. this.num = 0;
    18. this.is = new boolean[num];
    19. }
    20. //初始化结点
    21. public void creatAl(String[] string) {
    22. for(String s:string) {
    23. this.al.add(s);
    24. }
    25. }
    26. //初始化矩阵
    27. public void creatArr(int x, int y) {
    28. this.array[x][y] = 1;
    29. this.array[y][x] = 1;
    30. num++;
    31. }
    32. //打印矩阵
    33. public void printArr() {
    34. for(int[] i:array) {
    35. System.out.println(Arrays.toString(i));
    36. }
    37. }
    38. //访问第一个结点
    39. public int firstNode(int index) {
    40. for(int i = index; i < al.size(); i++) {
    41. if(array[index][i] > 0) {
    42. return i;
    43. }
    44. }
    45. return -1;
    46. }
    47. //访问下一个结点
    48. public int nextNode(int x, int y) {
    49. for(int i = y + 1; i < al.size(); i++) {
    50. if(array[x][i] > 0) {
    51. return i;
    52. }
    53. }
    54. return -1;
    55. }
    56. //孤立结点
    57. public void dfs() {
    58. for(int i = 0; i < al.size(); i++) {
    59. if(!is[i]) {
    60. dfs(is, i);
    61. }
    62. }
    63. }
    64. public void dfs(boolean[] b, int i) {
    65. System.out.print(al.get(i));
    66. is[i] = true;
    67. int w = firstNode(i);
    68. while(w != -1) {
    69. if(!is[i]) {
    70. dfs(b,w);
    71. }
    72. w = nextNode(i,w);
    73. }
    74. }
    75. //广度
    76. public void bfs(boolean[] b,int i) {
    77. System.out.print(al.get(i));
    78. b[i] = true;
    79. //队列取头结点
    80. int u;
    81. //第一个领结点
    82. int w;
    83. LinkedList queue = new LinkedList();
    84. queue.addLast(i);
    85. while(!queue.isEmpty()) {
    86. u = (int) queue.removeFirst();
    87. w = firstNode(u);
    88. while(w != -1) {
    89. if(!is[w]) {
    90. System.out.print(al.get(w));
    91. is[w] = true;
    92. queue.addLast(w);
    93. }
    94. w = nextNode(u,w);
    95. }
    96. }
    97. }
    98. public void bfs() {
    99. for(int i = 0; i < al.size(); i++) {
    100. if(!is[i]) {
    101. bfs(is,i);
    102. }
    103. }
    104. }
    105. }
    1. package graph;
    2. public class T {
    3. public static void main(String[] args) {
    4. String[] string = {"A","B","C","D","E"};
    5. G g = new G(5);
    6. g.creatAl(string);
    7. g.creatArr(0, 1);
    8. g.creatArr(0, 2);
    9. g.creatArr(1, 3);
    10. g.creatArr(2, 3);
    11. g.creatArr(3, 4);
    12. g.printArr();
    13. // g.index();
    14. g.bfs();
    15. }
    16. }

  • 相关阅读:
    Qt实战 数据统计柱状图显示
    java计算机毕业设计-数字相册管理系统-源程序+mysql+系统+lw文档+远程调试
    UI组件Kendo UI for Angular R3 2022亮点——让应用程序体验更酷炫
    C++模板类与Java泛型类的实战应用及对比分析
    Jest + React 单元测试最佳实践
    【宏offsetof详解和模拟实现】
    My Ninety-ninth Page - 两个字符串的删除操作 - By Nicolas
    Netty
    【博客455】Linux网桥如何接管attach上来的设备的流量
    C++征途 --- string容器
  • 原文地址:https://blog.csdn.net/qq_56127002/article/details/126566757