参考https://blog.youkuaiyun.com/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)的转置是图GT=(V,ET)G^T=(V,E^T)GT=(V,ET), 这里ETE^TET={ (v,u)∈VV; (u,v)∈ E }.因此,图GTG^TGT就是将有向图G中所有边的方向反过来而形成的图。对于邻接链表和邻接矩阵两种表示,请给出从图G中计算出GTG^TGT的有效算法,并分析算法的运行时间。*
即对于有向图而言,要把所有的边反向,
如果是邻接矩阵,那么直接某格和某格交换,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)的平方图是图G2=(V,E2)G^2=(V,E^2)G2=(V,E2),这里,边(u,v)∈E2E^2E2当且仅当图G包含一条最多由两条边构成的从u到v的路径。请给出一个有效算法来计算图G的平方图G2G^2G2,这里图G既可以以邻接链表来表示,也可以用邻接矩阵来表示,请分析算法的运行时间。
解:
参考:https://blog.youkuaiyun.com/qq_35859033/article/details/78534993
什么是平方图呢,图是一个矩阵,那么矩阵*矩阵得到一个矩阵,
有cijc_{ij}cij=∑K=1n\sum_{K=1}^n∑K=1naik∗bkja_{ik}*b_{kj}aik∗bkj,而矩阵里每一格子(x,y)表示x到y可行否,那么 aik∗bkja_{ik}*b_{kj}aik∗bkj1,则表示 i可到k,k可到j,那也就是说存在走两步从 i到j 的路径。那么cijc_{ij}cij 表示的就是有多少条经过两步从i到j的路径==。
因此如果用邻接矩阵表示的,从上面的公式可知就得用 o(VV(2v-1))的时间,
如果用邻接链表表示,找每个边用o(V+E),找aija_{ij}aij用o(ViV_iVi),找bjkb_{jk}bjk再用O(VjV_jVj),总共是o(V+EVV);
而如果用空间换时间,邻接矩阵和邻接链表都使用,那么o(V+EV);
22.1-6 多数以邻接矩阵作为输入的图算法的运行时间为 Ω(V2V^2V2),但也有例外。给定图G的邻接矩阵表示,请给出一个O(V)时间的算法来判断有向图G中是否存在一通用汇点。通用汇点是指入度为 |V|-1但出度为0的结点。
如果i到j是
思考矩阵,如果横行 i 表示出度,纵行 j 表示入度,那么要汇点也就是横行都为0,