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]=前一个纳入的节点

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

  • 相关阅读:
    存储器的分配与回收算法实现
    jsoup抓取借书记录
    java学习碰到死胡同了
    PHP MYSQL登陆和模糊查询
    JAVA进阶之路(一)
    String是最基本的数据类型吗?
    面向对象的特征有哪些方面
    sqoop
    你真的理解 new 了吗?
    面试题目 字符串的去重与压缩(统计)
  • 原文地址:https://www.cnblogs.com/zjgtan/p/3387772.html
Copyright © 2011-2022 走看看