《算法导论》习题解答 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酱。这里是偶尔做做搬运工的水果君(^_^) )

转载于:https://www.cnblogs.com/java20130723/p/3212121.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值