zoukankan      html  css  js  c++  java
  • 算法与数据结构(三)图算法

    图的搜索技术是图算法领域的核心。

    1、图的表示

      通常采用两种方法表示一个图G=(V, E),即邻接表和邻接矩阵。

      邻接表,表示稀疏图,需要的存储空间为O(V+E)

      邻接矩阵,表示稠密图,需要的存储空间为O(V^2)

    2、广度优先搜索

      广度优先搜索是Prim最小生成树算法和Dijkstra单源最短路径算法中的主要思想。广度优先搜索始终将已发现和未发现顶点之间的边界,沿其广度方向向外发展。因此,每一轮向外扩展都将节点分为三个集合:已搜索集合(BLACK)、未搜索集合(WHITE)、边缘集合(GRAY)。在程序中,用队列保存每一轮向外扩展的节点,保证向外扩展的有序性。

    伪代码:

    BFS(G, s)
        for each vertex u in V[G] - {s}
            do color[u] = WHITE
                d[u] = NAN
                pi[u] = NIL
        color[s] = GRAY
        d[s] = 0
        pi[s] = NIL
        Q = NULL
        ENQUEUE(Q, s)
        while Q != NULL
            do u = DEQUEUE(Q)
               for each v in Adj[u] //扩展邻接节点
                    do if color[v] == WHITE
                       then color[v] = GRAY //边缘节点
                            d[v] = d[u] + 1
                            pi[v] = u
                            ENQUEUE(Q, v) //边缘节点入队列
               color[u] = BLACK

     dijkstra单源最短路径

    对于一个图,假设有N个节点。

    初始化distance[N]数组,保存节点到源点的距离,有直接连接的为边长,没有直接连接的为无穷大;

    初始化path[N]数组,保存节点路径的前驱节点;

    初始化visited[N]数组,将节点集合划分为以访问和未访问两类

    进行N轮迭代:

      首先用最近纳入已访问的节点来更新未访问节点的distance,distance[x]+vetex[x,y]<distance[y]?

      选取当前未访问节点中distance最小的节点纳入已访问节点,path[x]=前一个纳入的节点

    迭代的输出路径,用递归的方法处理正序变倒序的问题。

  • 相关阅读:
    如何打开肉鸡的3389端口(xp的)
    XP鲜为人知的实用技巧(一)
    利用Ms08067工具进行溢出攻击
    教你建一个别人看不到打不开的文件夹
    在IE上显示自己的名字
    QQ使用的七大非常规秘籍
    第五篇:Python函数基础篇
    Centos7之Systemd(Service文件)详解
    Linux GCC make文件的写法3
    DSP/BIOS学习笔记——2.SWI
  • 原文地址:https://www.cnblogs.com/zjgtan/p/3387772.html
Copyright © 2011-2022 走看看