参考https://blog.csdn.net/github_35807147/article/details/79110801
22.1-1 给定有向图的邻接链表,需要多长时间才能计算出每个结点的出度(发出的边的条数)?给定时间才能计算出每个节点的入度(进入的边的条数)?
一个图G(V,E),(V为点数,E为边数),邻接链表空间为O(V+E)。
而邻接表要遍历,因此计算每个节点的出度和入度的总时间都为O(V+E)
22.1-2 给定一棵有7个节点的完全二叉树的邻接链表,请给出等价的邻接矩阵表示。这里假设结点的编号为从1~7。
见书22章的图22-1 的a,b,c吧
22.1-3有向图G=(V,E)的转置是图
G
T
=
(
V
,
E
T
)
G^T=(V,E^T)
GT=(V,ET), 这里
E
T
E^T
ET={ (v,u)∈VV; (u,v)∈ E }.因此,图
G
T
G^T
GT就是将有向图G中所有边的方向反过来而形成的图。对于邻接链表和邻接矩阵两种表示,请给出从图G中计算出
G
T
G^T
GT的有效算法,并分析算法的运行时间。*
即对于有向图而言,要把所有的边反向,
如果是邻接矩阵,那么直接某格和某格交换,j即矩阵转置,时间是O(V^2)/2;
如果是邻接链表,那么要先开辟O(V+E)个空间,一 一遍历,重新建表格。
22.1-4 给定多图G= (V,E) 的邻接链表(多图是允许重复边和自循环边的图),请给出一个时间为O(V+E)的算法,用来计算该图的“等价”无向图 G’=(V,E’)的邻接链表表示。这里E’是将E中的冗余边和自循环边删除余下的边,删除冗余边指的是将两个结点之间的多条边替换为一条边。
标记法,第一次出现就不删除,这样就是o(V+E)了。
22.1-5 有向图G=(V,E)的平方图是图
G
2
=
(
V
,
E
2
)
G^2=(V,E^2)
G2=(V,E2),这里,边(u,v)∈
E
2
E^2
E2当且仅当图G包含一条最多由两条边构成的从u到v的路径。请给出一个有效算法来计算图G的平方图
G
2
G^2
G2,这里图G既可以以邻接链表来表示,也可以用邻接矩阵来表示,请分析算法的运行时间。
解:
参考:https://blog.csdn.net/qq_35859033/article/details/78534993
什么是平方图呢,图是一个矩阵,那么矩阵*矩阵得到一个矩阵,
有
c
i
j
c_{ij}
cij=
∑
K
=
1
n
\sum_{K=1}^n
∑K=1n
a
i
k
∗
b
k
j
a_{ik}*b_{kj}
aik∗bkj,而矩阵里每一格子(x,y)表示x到y可行否,那么
a
i
k
∗
b
k
j
a_{ik}*b_{kj}
aik∗bkj1,则表示 i可到k,k可到j,那也就是说存在走两步从 i到j 的路径。那么
c
i
j
c_{ij}
cij 表示的就是有多少条经过两步从i到j的路径==。
因此如果用邻接矩阵表示的,从上面的公式可知就得用 o(VV(2v-1))的时间,
如果用邻接链表表示,找每个边用o(V+E),找
a
i
j
a_{ij}
aij用o(
V
i
V_i
Vi),找
b
j
k
b_{jk}
bjk再用O(
V
j
V_j
Vj),总共是o(V+EVV);
而如果用空间换时间,邻接矩阵和邻接链表都使用,那么o(V+EV);
22.1-6 多数以邻接矩阵作为输入的图算法的运行时间为 Ω(
V
2
V^2
V2),但也有例外。给定图G的邻接矩阵表示,请给出一个O(V)时间的算法来判断有向图G中是否存在一通用汇点。通用汇点是指入度为 |V|-1但出度为0的结点。
如果i到j是
思考矩阵,如果横行 i 表示出度,纵行 j 表示入度,那么要汇点也就是横行都为0,