算法导论第22章部分答案

参考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) , 这里 E T E^T ={ (v,u)∈VV; (u,v)∈ E }.因此,图 G T G^T 就是将有向图G中所有边的方向反过来而形成的图。对于邻接链表和邻接矩阵两种表示,请给出从图G中计算出 G T G^T 的有效算法,并分析算法的运行时间。*
即对于有向图而言,要把所有的边反向,
如果是邻接矩阵,那么直接某格和某格交换,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) ,这里,边(u,v)∈ E 2 E^2 当且仅当图G包含一条最多由两条边构成的从u到v的路径。请给出一个有效算法来计算图G的平方图 G 2 G^2 ,这里图G既可以以邻接链表来表示,也可以用邻接矩阵来表示,请分析算法的运行时间。
解:
参考:https://blog.csdn.net/qq_35859033/article/details/78534993
什么是平方图呢,图是一个矩阵,那么矩阵*矩阵得到一个矩阵,
c i j c_{ij} = K = 1 n \sum_{K=1}^n a i k b k j a_{ik}*b_{kj} ,而矩阵里每一格子(x,y)表示x到y可行否,那么 a i k b k j a_{ik}*b_{kj} 1,则表示 i可到k,k可到j,那也就是说存在走两步从 i到j 的路径。那么 c i j c_{ij} 表示的就是有多少条经过两步从i到j的路径==。

因此如果用邻接矩阵表示的,从上面的公式可知就得用 o(VV(2v-1))的时间,
如果用邻接链表表示,找每个边用o(V+E),找 a i j a_{ij} 用o( V i V_i ),找 b j k b_{jk} 再用O( V j V_j ),总共是o(V+E
VV);
而如果用空间换时间,邻接矩阵和邻接链表都使用,那么o(V+E
V);

22.1-6 多数以邻接矩阵作为输入的图算法的运行时间为 Ω( V 2 V^2 ),但也有例外。给定图G的邻接矩阵表示,请给出一个O(V)时间的算法来判断有向图G中是否存在一通用汇点。通用汇点是指入度为 |V|-1但出度为0的结点。
如果i到j是
思考矩阵,如果横行 i 表示出度,纵行 j 表示入度,那么要汇点也就是横行都为0,

发布了114 篇原创文章 · 获赞 22 · 访问量 7052

猜你喜欢

转载自blog.csdn.net/qq_43235540/article/details/98053800