算法导论-----图论-----图的表示 课后题答案
图的表示课后题答案
1.课后题22.1-1
给一个图的邻接表,计算出每个顶点的出度需要多长时间?计算出每个顶点的入度需要多长时间?
出度:O(V+E)
入度:O(VE)
2.课后题22-1-3
求图G=(V,E)的转置图G=(V,ET),也就是将图G中所有边反向
(1)矩阵O(V2)
for (i=1; i<=V; i++)
for(j=i+1; j<=V; j++)
if(A[i][j] && !A[j][i])
{
A[i][j]=0;
A[j][i]=1;
}
(2)邻接表O(VE)
Allocate V list pointers for GT (Adj'[])
for(i=1; i<=V, i++)
for every vertex v in Adj[i]
add vertex i to Adj'[v]
3.课后题22-1-4
给一个多重图的邻接表表示,给出一个O(V+E),的时间算法,来计算其等价无向图G`=(V,E`)的邻接表表示,多重边用一条边表示,去掉自环
(1)创建一个新的邻接表
(2)如果一个点Vi出现在Vj的链表中,把Vj拷贝到新的邻接表Vi中
(3)对所有的点重复(2)
(4)创建一个新的邻接表,和标记边数组
(5)对每个链表首节点进行检查,是否有自环,是否标记过这个边
(6)有自环消除
(7)对没有标记过的边进行标记,并且把点复制到新的邻接表中
4.课后题22-1-5
求一个图边的平方
矩阵O(V3)
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))
Procedure G-Square (V(G),E(G))
V(G2)ßV(G)
For each u 属于 V(G)
For each v 属于 adj[u]
For each w 属于 adj[v]
E[G2]ß{(u,w)} 并 E[G2]
5.课后题22.1-6
给一个图的邻接矩阵,在O(V)的时间内,求一个图中通用的汇,即入度|V|-1,出度0
设第u个点为汇,即第u行全为0,第u列除第u行为0外其余全为1
如果第A[u][v]=1,u不可能是汇点;第A[u][v]=0;v不可能是汇点
算法:
Is-sink(A,k)
{
Let A be |V|*|V|
For jß1 to |V|
Do if akj=1 //检查第k行从1到n列是否有1,也就是是否有出度
Then return false
For iß1 to |V| //检查第k列从1到n行(非k行)是否有0,也就是是否无入度
Do if akj=0 and i!=k
Then return false
Return true
}
UNIVERSAL-SINK(A)
Let A be |A|*|A|
i=j=1;
while i<=|V| && j<=|V|
do if aij=1
then ißi+1
else jßj+1
sß0
if i>|V|
then return "there is no universal sink"
else if is-sink(A,i)==false
then return "there is no universal sink"
else then return i "is universal sink"
6. 课后习题22.1-7和22.1-8不会,还望牛人指点