zoukankan      html  css  js  c++  java
  • 数组表示邻接表

    首先我们依照读入的顺序为每一条边进行编号1~m

    比方第一条边“1 4 9”的编号就是1,“1 3 7”这条边的编号是5


    这里uvw三个数组用来记录每条边的详细信息,即u[i]v[i]w[i]表示第i条边是从第u[i]号顶点到v[i]号顶点(u[i]àv[i],且权值为w[i]


    091650h35zq3wgx30x3oe3.png

    再用一个first数组来存储每一个顶点当中一条边的编号以便待会我们来枚举每顶点全部的边(你可能存储当中一条边的编号就能够了?不可能吧,每一个顶点都须要存储其全部边的编号才行吧!甭着急。继续往下看比方1号顶点有一条边是 “1 4 9”(该条边的编号是1),那么就将first[1]的值设为1。假设某个顶点i没有以该顶点为起始点的边,则将first[i]的值设为-1。如今我们来看看详细怎样操作,初始状态例如以下。


    091650zw3988qpj5iljj8g.png


    咦?上图中怎么多了一个next数组。有什么作用呢?不着急。待会再解释。如今先读入第一条边“1 4 9”。


    读入第1条边1 4 9,将这条边的信息存储到u[1]v[1]w[1]

    同一时候这条边赋予一个编号由于这条边是最先读入的,存储在uvw数组下标为1的单元格中,因此编号就是1。这条边的起始点是1号顶点。因此将first[1]的值设为1


    另外这条编号为1的边1号顶点u[1]为起始点第一条边,所以next[1]的值设为-1。也是说,假设当前这条编号为i的边,是我们发现的u[i]起始点的第一条边。就将next[i]的值设为-1(貌似的这个next数组非常神奇啊⊙_

    091651kwo5g0aycy07wfwd.png


    读入第2条边4 3 8将这条边的信息存储到u[2]v[2]w[2]中。这条边的编号为2

    这条边的起始顶点是4号顶点,因此将first[4]的值设为2另外这条“编号为2的边”是我们发现以4号顶点为起始点的第一条边,所以将next[2]的值设为-1

    091651fkswcj34c05k8w4k.png


    读入第3条边1 2 5将这条边的信息存储到u[3]v[3]w[3]中。这条边的编号为3,起始顶点是1号顶点。我们发现1号顶点已经有一条编号为的边了。假设此时将first[1]的值设为3那“编号为1的边岂不是丢失了?我有办法,此时仅仅需将next[3]的值设为1就可以。如今你知道next数组是用来做什么的吧。

    next[i]存储的是“编号为i的边”的“一条边”的编号。

    091651df28foy9ct7fl7qf.png


    读入第4条边(2 4 6),将这条边的信息存储到u[4]v[4]w[4]中,这条边的编号为4起始顶点是2号顶点,因此将first[2]的值设为4

    另外这条“编号为4的边”是我们发现以2号顶点为起始点的第一条边。所以将next[4]的值设为-1

    091652vf4eg69f5zfsese9.png


    读入第5条边(1 3 7),将这条边的信息存储到u[5]v[5]w[5]中,这条边的编号为5,起始顶点1号顶点。此时须要first[1]的值设为5并将next[5]的值改为3

    091652li6mzammza242tmp.png


    此时,假设我们想遍历1号顶点的每一条边就非常easy1号顶点的当中一条边的编号存储在first[1]中。其余的边则能够通过next数组寻找到请看下图

    091652rtjh5qe2211eee58.png

                                                                                 算法8:巧妙的邻接表(数组实现)


    遍历1号顶点全部边的代码例如以下。

    1
    2
    3
    4
    5
    6
    k=first[1];// 1号顶点当中的一条边的编号(事实上也是最后读入的边)
    while(k!=-1) //其余的边都能够在next数组中依次找到
    {
        printf("%d %d %d ",u[k],v[k],w[k]);
        k=next[k];
    }

  • 相关阅读:
    redis 储存对象
    redis key 查看器
    c# 控制台程序编写RabbitMQ 生产者
    C# 使用Topshelf 构建 基于 window 服务的 RabbitMQ消费端
    asp.net webapi 使用定时任务Hangfire
    asp.net webpi 中使用 ClientHelper 发起HTTP请求
    SQL Server 导入和导出向导 未在本地计算机上注册Mircrosoft.ACE.OLEDB.12.0 提供程序
    c# 使用Linq 表达式 对查询结果分组,保留价格最低的一条
    Asp.Net s请求报传输流收到意外的 EOF 或 0 个字节
    asp.net webapi 中使用rdlc 报表
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9643423.html
Copyright © 2011-2022 走看看