22.1-1给定一个有向图的邻接表表示,计算该图中每个顶点的出度需要多少时间?计算每个顶点的入度需要多少时间?
入度:进入该顶点的边的数目。出度:从该顶点出去的边的数目。
计算出度和入度的时间都为O(v+e),计算出度和入度的过程相当于将邻接链表的顶点和边遍历一遍。22.1-3有向图G=(V,E)的转置是图 GT =(V, ET ),其中 ET ={(v,u) ∈ V × V:{u,v} ∈ E},因此 GT 就是将G中所有边反向后形成图。写出根据G计算出 GT 的有效算法(针对邻接表和邻接矩阵两种表示形式分别写出),并分析所给出算法的运行时间。
邻接链表:对于G的每个节点i,遍历其adj,将i添加到adj中遇到的每个节点的 GT 的adj中。这样就可以求出G的转置。时间就是遍历邻接链表的时间O(v+e)
邻接矩阵:就是求G的转置矩阵。时间为O( V2 )
22.1-4 给定一个多重图G=(V,E)的邻接表表示,给出一个具有O(V+E)时间的算法,来计算其“等价”的无向图G’=(V,E’)的邻接表表示,其中E’包含E中所有的边,且将两个顶点之间的所有多重边用一条边代表,并去掉E中所有的环。
遍历邻接链表,对于G中每个节点i,将其adj中未出现过的邻居,且不是i自己的节点加入G’中i的adj中。该算法时间为O(V+E)
- 22.1-5有向图G=(V,E)的平方是图 G2 =(V, E2 ),该图满足下列条件:(u,w) ∈ E2 当且仅当对v ∈ V,有(u,v) ∈ E,且(v,w) ∈ E。亦即,如果图G中顶点u,w之间存在着一条恰好包含两条边的路径时,则 G2 必包含边(u,w)。针对图G的邻接表和邻接矩阵两种表示法,分别写出根据G产生 G2 的有效算法,并分析所给算法的运行时间。
示意性伪码
邻接链表:
G2.V=G.V
for each u in G.V
for each v in G.Adj[u]
for each w in G.Adj[v]
G2.E=G2.E+{(u,w)}
邻接矩阵:
for i =1 to |V|
for j= 1 to |V|
G2[i][j]=0
for k=1 to |V|
if G[i][k]==1&&G[k][j]==1
G2[i][j]=1
break
显然,两种时间复杂度都为O( V3 )