重要题型整理:数据结构与算法——图

  1. (数据结构与算法mooc)当各边上的权值满足什么要求时,宽度优先搜索算法可用来解决单源最短路径问题?What requirement do the weight of edges should satisfied to make width-first search algorithm can solve single source shortest path problem?
    A.均相等Equal
    B.不一定相等 No limitation.
    C.均互不相等 Each edge is not equal to each other.
    D.不一定相等(忽略该选项)

解析:A
宽度优先搜索算法的搜索状态树是一层一层的扩展结点的,而当边权均相等时,步数越少距离越短,所以可以直接用宽度优先搜索算法解决。

  1. (数据结构与算法mooc)下图中的强连通分量的个数为多少个?
    How many strongly connected graphs in the under graph?

解析:3
最左边和最右边单独的算强连通分量

  1. (书面作业)证明:只要适当地排列列顶点的次序,就能使有向⽆无环图的邻接矩阵中主对⻆角线以下的元素全部为0.

解析:“适当的排列”,想学过的几种排列方式:深搜、广搜、拓扑排序等
任意n个结点的有向⽆无环图都可以得到⼀一个拓拓扑序列列。设拓拓扑序列列为v0, v1, . . . , vn−1,证明此时的邻接矩阵A为上三⻆角矩阵。
反证法:
假设此时的邻接矩阵不是上三⻆矩阵,那么存在下标i和j(i>j),使得 A[i][j]不等于零,即图中存在从vi到vj的⼀条有向边,由拓扑序列的定义可知,在任意拓扑序列中,vi的位置⼀定在vj之前而在上述拓扑序列v0, v1, . . . , vn−1中,由于i>j,vi的位置在vj之后,导致⽭盾.因此命题正确.

  1. (书面作业)单源最短路径问题中,当路径中存在负权边时(不存在负权回路)不可以使⽤Dijkstra算法: (注:题中分析时间复杂度时,默认存储结构是邻接表,且使用最⼩小堆存储源点到各点的路径值)
    b) 另外一种想法是: 利用Dijkstra算法,在算法运⾏过程中, 若 w 已经在 S 中,但是由于与 w 相邻的点加⼊ S 中而新计算得到的 dist[w]⽐ S 中存储的 dist[w]还要小,那么将 w 从 S 中剔除,重新加入未知集合 T 中。请问这种算法可⾏吗?若可行,请说明理由并分析时间复杂度;若不可行,请举反例例。

解析:可⾏
因为当⼀个点v在已知集合S中,则在以后的算法步数中,不再检查经过点v的路径, 但是因为存在负权边,可能v的权重会变的更更⼩,此时所有经过v到达的点,权值均可能改变。则按照改进的算法,相当于每加入一个结点都更新一次到所有点的距离,并把会被改动的点从 S 中剔除重新计算。与 Floyd 算法类似,这样最终记录的是所有点都加入 S 后的最小值。
复杂度:
最坏情况,加入第 n 个点后,前面的第 1~n-1 个点都要 剔除,后面再加入时这前 n-1 个点及其更新过的结点都要再更新一次,所以 加入第 n 个结点后引起的更改是前 n-1 个结点总更新量的 2 倍。故总时间 为 数据结构与算法 图谱 数据结构与算法画图题_数据结构与算法 图谱。一共加入 n 次,总时间复杂度:数据结构与算法 图谱 数据结构与算法画图题_邻接矩阵_02

+:补充说明:

  • 题中提到“不存在负权回路”,因此没有负权无向边(否则会出现来回走这条边得到-∞
  • 只用剔除一个点的原因:假如加入新结点之后值变小的结点是B,原来有边B-C且C进了S中,C不用专门剔除的原因:下一次B进S的时候会给C的距离重新赋值,就会发现C的距离也变小了,这个时候又满足抛出C的条件了,所以不用提前抛出.
  1. (2016期末)对于一个包含N(N>1)个顶点的图,假定任意两点间最多只有一条边,那么下列哪些情况是错误的_________。
    A.如果是有向图,则其任何一个极大强连通子图都无法进行拓扑排序。
    B.如果是无向连通图,则其最小生成树一定不包括权重最大的边。
    C.如果是无向连通图,假设所有边的权重均为正值,
    Dijkstra算法给出的生成树不一定是最小生成树,但是与该图的任何一个最小生成树都至少有一条相同边。

解析:AB
A中极大强连通子图可以是单个结点!!!