《算法导论》习题解答 Chapter 22.1-5(求平方图)
一、邻接矩阵实现
思路:如果是邻接矩阵存储,设邻接矩阵为A,则A*A即为平方图,只需要矩阵相乘即可;
伪代码:
for i=1 to n
for j=1 to n
for k=1 to n
result[i][j]+=matrix[i][k]*matrix[k][j];
算法复杂度
两个n维数组相乘,因此复杂度为O(V^3),当然可以通过Strassen算法稍加改进.
扩展:这种方法的作用是比如求u到v路径长度为k的路径数目,只需要求A^k,然后[u][v]即可。
算法正确性分析
命题:给定两点i,j,i,j路径长度为r的路径数目等于A^r[i][j].
数学归纳法证明,
当n=1时,A[i][j]表示i到j的路径长度为1的路径数目。
假设n=k时,i,j路径长度为k的路径数目等于A^k[i][j]成立,则当n=k+1时,A^k+1 = A^k *A
因此A^k+1[i][j]=A^k[i][1]*A[1][j]+A^k[i][2]*A[2][j]+.....+A^k[i][|V|]*A[|V|][j]
因此成立。
输入:
4 3
a b
b c
c d
源代码:
package C22;
public class C1_5 {
public static void main(String[] args) throws Exception {
Adjacent_Matrix adj_matrix = GraphFactory.getAdjacentMatrixInstance("input\\22.1-5.txt");
int[][]result = getSquareGraph(adj_matrix);
print(result);
}
public static int[][] getSquareGraph(Adjacent_Matrix g){
int[][] matrix = g.getMatrix();
int result[][] = new int[matrix.length][matrix.length];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix.length;j++){
for(int k=0;k<matrix.length;k++){
result[i][j] += matrix[i][k]*matrix[k][j];
}
}
}
return result;
}
public static void print(int[][] arr){
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length;j++)
System.out.print(arr[i][j]+" ");
System.out.println();
}
System.out.println();
}
}
二、邻接表实现
伪代码:
for u=1 to |V|
for each v 属于 Adj[u]
Adj1[u].insertAll(Adj[v]);
对G'去除重边; //O(E^2)
复杂度:
1~3行的复杂度为O(V+E)
4行的复杂度为O(E^2),因为最多能够生成O(E^2)条边。
(原文点此,索引目录。感谢xiazdong君
&& Google酱。这里是偶尔做做搬运工的水果君(^_^)
)
《算法导论》习题解答 Chapter 22.1-5(求平方图)的更多相关文章
- 《算法导论》习题解答 Chapter 22.1-6(求universal sink 通用汇点)
思路:设置两个游标i指向行,j指向列,如果arr[i][j]==1,则i=max{i+1,j},j++:如果arr[i][j]==0,则j=max{i+1,j+1}. 伪代码: has_univers ...
- (搬运)《算法导论》习题解答 Chapter 22.1-1(入度和出度)
(搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegre ...
- 《算法导论》习题解答 Chapter 22.1-4(去除重边)
思路:重开一个新图,按着邻接列表的顺序从上到下遍历,每遍历一行链表前,清空visited数组,如果没有访问过这个元素,则加入新图,如果已经访问过了(重边),则不动. 伪代码: 复杂度:O(V+E) f ...
- 《算法导论》习题解答 Chapter 22.1-8(变换邻接表的数据结构)
一般散列表都与B+树进行比较,包括在信息检索中也是. 确定某条边是否存在需要O(1). 不足: (1)散列冲突. (2)哈希函数需要不断变化以适应需求. 另外:B+树.(见第18章) 与散列表相比的不 ...
- 《算法导论》习题解答 Chapter 22.1-7(关联矩阵的性质)
主对角线:出度+入度 其他:arr[i][j]=-n,则i与j之间有n条边. 证明: (原文点此,索引目录.感谢xiazdong君 && Google酱.这里是偶尔做做搬运工的水果君( ...
- 《算法导论》习题解答 Chapter 22.1-3(转置图)
一.邻接表实现 思路:一边遍历,一边倒置边,并添加到新的图中 邻接表实现伪代码: for each u 属于 Vertex for v 属于 Adj[u] Adj1[v].insert(u); 复杂度 ...
- 《算法导论》习题解答 Chapter 22.1-2(邻接矩阵与链表)
链表如图: 矩阵: 1 2 3 4 5 6 7 1 0 1 1 0 0 0 0 2 1 0 0 1 1 0 0 3 1 0 0 0 0 1 1 4 0 1 0 0 0 0 0 5 0 1 0 0 0 ...
- C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 3
Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的 ...
- C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 2
Chapter 2.1 1. 数据类型决定了程序中数据和操作的意义. 2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型.算术类型包含了字符.整型.布尔值以及浮点数.vo ...
随机推荐
- css3妙用 刷新图标
从猫眼电影看到的一个图标 .geopos i:before { content: ""; width: .8em; height: .8em; border: .14em soli ...
- IIS6.0禁止用户下载txt文件
服务器win2003+IIS6.0,在IIS上限制下载.txt文件,方法比较简单,在IIS的应用程序扩展名映射中为资源扩展名指定一个错误的可执行文件即可. 打开记事本,直接将空内容保存为C:\WIND ...
- 标准Dispose实现 (转)
需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源 ...
- mysql 清除数据库数据
select Concat('TRUNCATE TABLE ', TABLE_NAME, ';') from INFORMATION_SCHEMA.TABLES
- Java集合框架(JCF)之collention
一.概念:是为了实现某一目的或功能而预先提供的一系列封装好了的具有继承或实现的类与接口. 二.特点: 1.元素的类型可以不同 2.集合长度可变 3.空间不固定 三.collection与collec ...
- 【转】Android开发实践:自定义带消息循环(Looper)的工作线程
http://ticktick.blog.51cto.com/823160/1565272 上一篇文章提到了Android系统的UI线程是一种带消息循环(Looper)机制的线程,同时Android也 ...
- 汽车常用的ECU芯片
Power Train ECU的CPU用的比较多的基本来自于Infineon,ST,Freescale BOSCH的16位ECU M(E)7系列主要使用C167内核的CPU,早期的M(E)7系列使用西 ...
- python学习进阶一
map()函数 def format_name(s): return s.capitalize() print map(format_name, ['adam', 'LISA', 'barT']) R ...
- Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索
D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...
- mysql中自己定义函数编程
语法: 新建: Create function function_name(參数列表)returns返回值类型 函数体 函数名,应该合法的标识符,而且不应该与已有的keyword冲突. 一个函数应该属 ...