转自:http://blog.csdn.net/chan15/article/details/49620221

22.1-1 给定有向图的邻接链表,需要多长时间才能计算出每个结点的出度(发出的边的条数)?多长时间才能计算出每个结点的入度(进入的边的条数)?

ANSWER:① 出度:O(V+E),因为计算 n 个结点的链表长度为 O(n),所以需要计算 O(V) 个链表长度时间为 O(V+E)。② 入度:O(V+E),同理。

 

22.1-2 给定一棵有 7 个结点的完全二叉树的邻接链表,请给出等价的邻接矩阵表示。这里假设结点的编号为从 1~7。

ANSWER:

算法导论22.1图的表示 练习总结 (转载)

22.1-3 有向图 G = (V,E) 的转置是图 G^T = (V,E^T),这里 E^T = {(v,u) ∈ V * V : (u,v) ∈ E}。因此,图 G^T 就是将有向图 G 中所有边的方向反过来而形成的图。对于邻接链表和邻接矩阵两种表示方法,请给出从图G 计算出 G^T 的有效算法,并分析算法的运行时间。

ANSWER:

邻接链表:用 O(V+E) 时间遍历链表,获取所有结点。对结点为 i 的链表,将结点 i 放在以该链表的数组 Adj 为结点的链表中;时间为 O(V+E)。

邻接矩阵:返回原矩阵的转置,时间为 O(V^2)。

 

22.1-4 给定多图 G = (V,E) 的邻接链表(多图允许重复边和自循环边的图),请给出一个时间为 O(V+E) 的算法,用来计算该图的“等价”无向图 G‘ = (V,E') 的邻接链表表示。这里 E' 是将 E 中的冗余边和自循环边删除后余下的边。删除冗余边指的是将两个节点之间的多条边替换为一条边。

ANSWER:遍历多图 G 的每个链表,并复制链表;若链表的 Adj 元素与链表头节点重复,则不复制该元素;若链表中 Adj 元素重复多次出现,则只复制一次。复制完成后,新的邻接链表若出现只有头结点的链表,则删除该链表。

 

22.1-5 有向图 G = (V,E) 的平方图是图 G2 = (V,E2),这里,边 (u, v) ∈ E2 当且仅当图 G 包含一条最多由两条边构成的从 u 到 v 的路径。请给出一个有效算法来计算图 G 的平方图 G2。这里图 G 既可以以邻接链表表示,也可以以邻接矩阵表示。请分析算法的运行时间。

ANSWER:邻接矩阵,时间复杂度:O(V^3)。

for i = 1 to n
    for j = 1 to n
        if G[i][j] == 1
            G2[i][j] = 1
        else
            for k = 1 to n
                if G[i][k] == 1 and G[k][j] == 1
                    G2[i][j] = 1
                else
                    G2[i][j] = 0
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-07-14
  • 2022-12-23
  • 2021-08-22
  • 2021-10-27
  • 2021-08-03
  • 2022-12-23
猜你喜欢
  • 2021-05-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-19
  • 2022-12-23
相关资源
相似解决方案