1. 程式人生 > >《演算法導論》習題解答 Chapter 22.1-5(求平方圖)

《演算法導論》習題解答 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平方

一、鄰接矩陣實現思路:如果是鄰接矩陣儲存,設鄰接矩陣為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][

演算法導論習題解答 Chapter 22.1-4去除重邊

思路:重開一個新圖,按著鄰接列表的順序從上到下遍歷,每遍歷一行連結串列前,清空visited陣列,如果沒有訪問過這個元素,則加入新圖,如果已經訪問過了(重邊),則不動。 虛擬碼: 複雜度:O(V+E) for each u 屬於 Vertex visited[u]

演算法導論習題解答 Chapter 22.1-6universal sink 通用匯點

思路:設定兩個遊標i指向行,j指向列,如果arr[i][j]==1,則i=max{i+1,j},j++;如果arr[i][j]==0,則j=max{i+1,j+1}。 虛擬碼: has_universal_sink() for i=1 to N //對

演算法導論習題解答Chapter2學習筆記

目錄 2.1-1 2.1-2 2.1-3 2.1-4 2-4: Chapter2 2.1-1 以升序排列為例 首先取出陣列中的第二個元素,然後和這個元素的前面的元素組成的子陣列從子陣列中的最後一個元素開始比較,如果該元素大於待

演算法導論 第13章 紅黑樹圖文詳細解說

1、二叉查詢樹的不足 二叉查詢樹的基本操作包括搜尋、插入、刪除、取最大和最小值等都能夠在O(h)(h為樹的高度)時間複雜度內實現,因此能在期望時間O(lgn)下實現,但是二叉查詢樹的平衡性在這些操作中並沒有得到維護,其高度可能會變得很高,當其高度較高時,二叉查詢樹的效能就未

企業使用者率先嚐試 Kubernetes 1.5支援 Windows 版本_Kubernetes中文社群

Kubernetes 在企業市場大受歡迎,但是如果它不能夠支援更多的作業系統以及更多程式語言的話,發展道路也會受阻。 隨著 Kubernetes1.5 的釋出,企業使用者現在也可以在 Windows 環境中執行 Kubernetes 了。 在一些大型企業的生產中,Kubernetes 也支援

Python練習題5水仙花數:編寫一個程式, 100~999 之間的所有水仙花數 (如果一個 3 位數等於其各位數字的立方和,則稱這個數為水仙花數

方法一:使用int和str,將int轉成字串拼接後再轉成int。 1 for i in range(1,10): 2 for j in range(0,10): 3 for k in range(0,10): 4 num = int(str(i) + s

演算法導論習題---n個元素任何排列中逆序對的數量

問題描述: 設A[1…n]是一個包含n個不同數的陣列。如果在i < j的情況下,有A[i] > A[j],則(i,j)就稱為A中的一個逆序對(inversion),(逆序對的元素是下標,而不是數組裡的值)。給出一個演算法,它能用Θ(nlgn)的最壞

演算法導論習題練習——紅黑樹的插入和刪除

題目 13.3-2 將關鍵字 41、38、31、12、19、8 連續地插入一棵初始化為空的紅黑樹之後,試畫出該結果樹。 Solution: 13.4-3 在練習13.3-2中,我們將關鍵字41

演算法導論第十五章15.5-2構造最優二叉搜尋樹

#include "StdAfx.h" #include <iostream> #include <vector> using namespace std; void optimal_bst(vector<double>&

演算法導論第三版 22.3 深度優先搜尋 課後題答案全解析

22.3 深度優先搜尋:1. 問有向圖和無向圖可能存在的三種顏色的點到點之間的邊。這個問題比較簡單,直接上傳原版答案,但是要注意,有向圖中存在黑色點到其他點的邊,雖然黑色點是已經搜尋結束的,但是這樣的邊始終存在。有向圖: 無向圖: 2. 答案如下: 注意其中數字沒有重複的,無

10-GLBP Weighting //2.1.5GNS3版本,後面都是如此註明

track imu enc 出現 res ado p地址 con cap 一、實驗拓撲:二、實驗要求:1、R1、R2、R3、R4部署EIGRP 90協議;2、R1、R2、R3的f1/0接口配置192.168.10.X、24地址;3、PC1的默認網關為:192.168.10.

【Java】 大話資料結構(18) 排序演算法(5) 直接插入排序 資料結構與演算法合集 資料結構與演算法合集

本文根據《大話資料結構》一書,實現了Java版的直接插入排序。 更多:資料結構與演算法合集 基本概念   直接插入排序思路:類似撲克牌的排序過程,從左到右依次遍歷,如果遇到一個數小於前一個數,則將該數插入到左邊所有比自己大的數之前,也就是說,將該數前面的所有更大的數字都後移一位,空出來的位置放入該數。

noip初賽整理1.4 & 1.5軟體系統和語言

計算機軟體系統                                                                          軟體系統                                  系統軟體      

Spark 1.5.2(Scala 2.11版本的編譯與安裝

Spark於11月9號又將幾個BUG解決之後,release一個較新的版本。作為spark的追隨者,於是開始重新進行spark的編譯。 有了前面的編譯經驗和之前下載好的java類包,花了大概一分鐘就編譯妥當,於是重新部署配置一下,馬上OK。簡直是高效率。 對於scala

演算法導論》第七章-快速排序虛擬碼

快速排序 虛擬碼:  QuickSort(A,p,r)        if p<r             q = Partition(A,p,r)    //確定劃分位置          

anaconda 升級/安裝最新包 tensorflow 1.5eg

用anaconda安裝最新的TensorFlow版本 問題: 如在anaconda搜尋依舊是tensorflow1.2的版本,如何用conda下載最新版本(其他包相同) 解決方法: 1,開啟anaconda-prompt 2,檢視tensorflow各

演算法導論-----最長公共子序列LCS動態規劃

目錄 一.概念梳理   1. 子序列(subsequence): 一個特定序列的子序列就是將給定序列中零個或多個元素去掉後得到的結果(不改變元素間相對次序)。例如序列<A,B,C,B,D,A,B>的子序列有:<A,B>、&l

使用aconda3-5.1.0Python3.6.4 搭建pyspark遠端部署

前言 首次安裝的環境搭配是這樣的: jdk8 hadoop2.6.5 spark2.1 scala2.12.4 Anaconda3-5.1.0 一連串的報錯讓人驚喜無限,儘管反覆調整配置始終無法解決。 坑了一整

演算法導論》紅黑樹詳解:Java實現Demo

使用Java簡單地實現紅黑樹,程式碼如下: /** * 紅黑樹實現demo */ public class RedBlackTree<Key extends Comparable<Key>> { private stati