一、邻接矩阵实现



思路:如果是邻接矩阵存储,设邻接矩阵为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(求平方图)的更多相关文章

  1. 《算法导论》习题解答 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 ...

  2. (搬运)《算法导论》习题解答 Chapter 22.1-1(入度和出度)

    (搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegre ...

  3. 《算法导论》习题解答 Chapter 22.1-4(去除重边)

    思路:重开一个新图,按着邻接列表的顺序从上到下遍历,每遍历一行链表前,清空visited数组,如果没有访问过这个元素,则加入新图,如果已经访问过了(重边),则不动. 伪代码: 复杂度:O(V+E) f ...

  4. 《算法导论》习题解答 Chapter 22.1-8(变换邻接表的数据结构)

    一般散列表都与B+树进行比较,包括在信息检索中也是. 确定某条边是否存在需要O(1). 不足: (1)散列冲突. (2)哈希函数需要不断变化以适应需求. 另外:B+树.(见第18章) 与散列表相比的不 ...

  5. 《算法导论》习题解答 Chapter 22.1-7(关联矩阵的性质)

    主对角线:出度+入度 其他:arr[i][j]=-n,则i与j之间有n条边. 证明: (原文点此,索引目录.感谢xiazdong君 && Google酱.这里是偶尔做做搬运工的水果君( ...

  6. 《算法导论》习题解答 Chapter 22.1-3(转置图)

    一.邻接表实现 思路:一边遍历,一边倒置边,并添加到新的图中 邻接表实现伪代码: for each u 属于 Vertex for v 属于 Adj[u] Adj1[v].insert(u); 复杂度 ...

  7. 《算法导论》习题解答 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 ...

  8. C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 3

    Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的 ...

  9. C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 2

    Chapter 2.1 1. 数据类型决定了程序中数据和操作的意义. 2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型.算术类型包含了字符.整型.布尔值以及浮点数.vo ...

随机推荐

  1. 程序设计第三次作业--C++计算器初始部分

    面向对象程序设计作业3--C++计算器初始部分 Github 链接:https://github.com/luojingzhao/object-oriented/tree/master/calcula ...

  2. jsp 是什么 ,jsp 隐式对象

    google 搜索 java server page http://www.oracle.com/technetwork/java/javaee/jsp/index.html http://docs. ...

  3. LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义

    UNICODE:它是用两个字节表示一个字符的方法.比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNI ...

  4. java使用jdbc对sqlite 添加、删除、修改的操作

    package com.jb.jubmis.Dao.DaoImpl; import java.io.File;import java.io.FileInputStream;import java.io ...

  5. C#调用存储过程详解

    连接字符串: string conn = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].C ...

  6. C:进制

     进制.C语言内存分配 1.对于进制 10进制 (0 - 9)16进制 (0——9 A B C D E F)硬件中的高低电平(0 和 1表示)所以计算机用 二进制 机器语言就是由 0 和 1 组成的一 ...

  7. SQLServer: 无法修改表

    工具—选项—Designers—表设计器和数据库设计器—阻止保存要求重新创建表的更改前的勾去掉.

  8. maven中解决javax.servlet.jsp.PageContext cannot be resolved to a type

    在eclipse环境下用maven出现:javax.servlet.jsp.PageContext cannot be resolved to a type. 这是由于没有引入jsp-api引发的问题 ...

  9. C#的WinForm中制作饼状图和柱状图

    using System; using System.IO;//用于文件存取 using System.Data;//用于数据访问 using System.Drawing;//提供画GDI+图形的基 ...

  10. 深入了解android平台的jni---本地多线程调用java代码

    一.jni调用java对象     JNI提供的功能之一是在本地代码中使用Java对象.包括:创建一个java类对象和通过函数传递一个java对象.创建一个java类对象,首先需要得到得到使用Find ...