• 数据结构:邻接矩阵与邻接表


    模型图

    邻接矩阵

    用于反应图中任意两点之间的关联,用二维数组表示比较方便

    以行坐标为起点,列坐标为终点如果两个点之间有边,那么标记为绿色,如图:

    适合表示稠密矩阵  

     

    邻接表

    用一维数组 + 链表的形式表示,以数组下标作为起点,链表中的每个节点作为终点形成的邻接表, 如图:

                                                             适合表示稀疏矩阵

     

    Java代码实现
    邻接矩阵

     

    1. public class AdjacentMatrix {
    2. private static Scanner scanner=new Scanner(System.in); //扫描器
    3. public static void main(String[] args) {
    4. System.out.println("------图转换为邻接矩阵------");
    5. System.out.println("请输入顶点的数量:");
    6. int vertex_count= scanner.nextInt();
    7. //开辟邻接矩阵
    8. boolean[][]adjacentMatrix=new boolean[vertex_count][vertex_count];
    9. //初始化矩阵
    10. for(int start=0;start
    11. {
    12. for(int end=0;end
    13. {
    14. adjacentMatrix[start][end]=false;
    15. }
    16. }
    17. //获取边
    18. System.out.println("请输入边的数量:");
    19. int edge_count=scanner.nextInt();
    20. System.out.println("请输入这些边的起点和终点,如(start end):");
    21. for(int i=0;i
    22. {
    23. int start= scanner.nextInt();
    24. int end= scanner.nextInt();
    25. //填充边
    26. adjacentMatrix[start][end]=true;
    27. }
    28. //打印输入结果
    29. System.out.println("所有边如下:");
    30. for (int start=0;start
    31. {
    32. for(int end=0;end
    33. {
    34. if(adjacentMatrix[start][end]==true)
    35. System.out.println(start+"->"+end);
    36. }
    37. }
    38. }
    39. }
    测试
    1. //输入:
    2. ------图转换为邻接矩阵------
    3. 请输入顶点的数量:
    4. 4
    5. 请输入边的数量:
    6. 5
    7. 请输入这些边的起点和终点,如(start end):
    8. 2 0
    9. 2 1
    10. 3 0
    11. 3 1
    12. 0 1
    13. //输出:
    14. 所有边如下:
    15. 0->1
    16. 2->0
    17. 2->1
    18. 3->0
    19. 3->1
    20. 进程已结束,退出代码为 0
     邻接表
    1. public class AdjacentList {
    2. private static class Edge{
    3. public Integer endId;
    4. public Edge nextEdge;
    5. public Edge(Integer endId) {
    6. this.endId = endId;
    7. this.nextEdge=null;
    8. }
    9. public Edge(Integer endId, Edge nextEdge) {
    10. this.endId = endId;
    11. this.nextEdge = nextEdge;
    12. }
    13. }
    14. private static Scanner scanner=new Scanner(System.in);
    15. public static void main(String[] args) {
    16. System.out.println("----------图转换为邻接表----------");
    17. System.out.println("请输入顶点的数量:");
    18. int vertex_count= scanner.nextInt();
    19. Edge[]adjacentList=new Edge[vertex_count];
    20. System.out.println("请输入边的数量:");
    21. int edge_count= scanner.nextInt();
    22. System.out.println("请输入这些边:");
    23. for(int i=0;i
    24. {
    25. int start= scanner.nextInt();
    26. int end= scanner.nextInt();
    27. if(adjacentList[start]==null)
    28. adjacentList[start]=new Edge(end);
    29. else
    30. adjacentList[start].nextEdge=new Edge(end,adjacentList[start].nextEdge);
    31. }
    32. System.out.println("邻接表如下:");
    33. for (int i = 0; i < adjacentList.length; i++)
    34. {
    35. System.out.print("start:"+i+" end:");
    36. for(Edge e=adjacentList[i];e!=null;e=e.nextEdge)
    37. {
    38. System.out.print("->"+e.endId);
    39. }
    40. System.out.println();
    41. }
    42. }
    43. }
    测试

     

    1. //输入:
    2. ----------图转换为邻接表----------
    3. 请输入顶点的数量:
    4. 4
    5. 请输入边的数量:
    6. 5
    7. 请输入这些边:
    8. 2 0
    9. 2 1
    10. 3 0
    11. 3 1
    12. 0 1
    13. //输出:
    14. 邻接表如下:
    15. start:0 end:->1
    16. start:1 end:
    17. start:2 end:->0->1
    18. start:3 end:->0->1
    19. 进程已结束,退出代码为 0

  • 相关阅读:
    canvas绘制扫描图
    41.企业实战项目rsync + inotify + shell脚本 实现实时同步
    Pytorch基础:Tensor的reshape方法
    【设计模式】Java设计模式 - 适配器模式
    java基础:基础语法
    Redis从理论到实战:用Redis解决缓存穿透、缓存击穿问题(提供解决方案)
    vue3 setup语法糖
    UE5 UE4 快速定位节点位置
    理论第十一课——字符串
    Ubuntu下解压文件(提取文件总是报错)文件是zip 格式
  • 原文地址:https://blog.csdn.net/weixin_74261199/article/details/134198168