转自: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-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