zoukankan      html  css  js  c++  java
  • 最短路径算法之五——邻接表

    邻接表

      邻接矩阵来存储图的信息相对于非完全图,会浪费大量的空间,同时在求最短路径的时候也会有多余的计算浪费时间。

      使用邻接表可以节约这些浪费的时间。

      这里介绍的是用数组模拟的邻接表:

      定义begin[MAXN],end[MAXN],dis[MAXN],first[MAXN],next[MAXN]五个数组。

      PS:first[]数组与顶点个数相同,next[]数组与边的个数相同。

      例子描述如下:

        4 5

        1 4 9

        4 3 8

        1 2 5

        2 4 6

        1 3 7

    Step1

     

    1

    2

    3

    4

    5

    begin

     

     

     

     

     

    end

     

     

     

     

     

    dis

     

     

     

     

     

    first

    -1

    -1

    -1

    -1

    -1

    next

     

     

     

     

     

    Step2

     

    1

    2

    3

    4

    5

    begin

    1

     

     

     

     

    end

    4

     

     

     

     

    dis

    9

     

     

     

     

    first

    1

    -1

    -1

    -1

    -1

    next

    -1

     

     

     

     

    Step3

     

    1

    2

    3

    4

    5

    begin

    1

    4

     

     

     

    end

    4

    3

     

     

     

    dis

    9

    8

     

     

     

    first

    1

    -1

    -1

    2

    -1

    next

    -1

    -1

     

     

     

    Step4

     

    1

    2

    3

    4

    5

    begin

    1

    4

    1

     

     

    end

    4

    3

    2

     

     

    dis

    9

    8

    5

     

     

    first

    3

    -1

    -1

    2

    -1

    next

    -1

    -1

    1

     

     

    Step5

     

    1

    2

    3

    4

    5

    begin

    1

    4

    1

    2

     

    end

    4

    3

    2

    4

     

    dis

    9

    8

    5

    6

     

    first

    3

    4

    -1

    2

    -1

    next

    -1

    -1

    1

    -1

     

    Step6

     

    1

    2

    3

    4

    5

    begin

    1

    4

    1

    2

    1

    end

    4

    3

    2

    4

    3

    dis

    9

    8

    5

    6

    7

    first

    5

    4

    -1

    2

    -1

    next

    -1

    -1

    1

    -1

    3

    创建邻接表:

     1 nt n,m,i;
     2 int begin[6],end[6],dis[6];
     3 int first[6],next[6];
     4 scanf("%d %d",&n,&m);
     5 //初始化first数组
     6 for(i=1;i<=n;i++)
     7     first[i]=-1;
     8 for(i=1;i<=m;i++)
     9 {
    10     scanf("%d %d %d",&begin[i],&end[i],&dis[i]);
    11     next[i]=first[begin[i]];
    12     first[begin[i]]=i;
    13 }

    遍历1号顶点所有边:

     

    1 k=first[1];
    2 while(k!=-1)
    3 {
    4     printf("%d %d %d
    ",begin[k],end[k],dis[k]);
    5     k=next[k];
    6 }

     

     部分图片文字摘自于啊哈磊的blog。

     

  • 相关阅读:
    第一章 监控系统入门
    第十八章 Tagging_Redis6.2.1 服务器部署
    第十五章 ACL安全策略
    第十七章 Redis常见管理命令
    第五章 监控系统zabbix快速监控一台主机
    第十九章 Redis6.2.1脚本安装
    第三章 监控系统zabbix4.2官方源安装
    第十六章 Redis6.0其他新功能
    CSS教程:div垂直居中的N种方法
    css 文本两端对齐
  • 原文地址:https://www.cnblogs.com/Enumz/p/3862969.html
Copyright © 2011-2022 走看看