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

本文介绍了图的两种转置实现方法:邻接表实现和邻接矩阵实现。通过实例展示了如何构建图的转置,包括源代码示例,有助于理解图的转置概念及其在算法中的应用。
一、邻接表实现

思路:一边遍历,一边倒置边,并添加到新的图中

邻接表实现伪代码:

for each u 属于 Vertex
	for v 属于 Adj[u]
		Adj1[v].insert(u);

复杂度:O(V+E);

输入:

3 3
a b
b c
c a

源代码:

package C22;

import java.util.Iterator;

public class C1_3{

	public static Adjacent_List getTransposeGraph(Adjacent_List g){
		Adjacent_List Gt = new Adjacent_List(g.getSize());
		for(int u=0;u<g.getSize();u++){
			Iterator<String> iter = g.getListByVertexIndex(u).iterator();
			while(iter.hasNext()){
				String vstr = iter.next();
				Gt.addEdge(vstr , g.getVertexValue(u));	//添加导致边
			}
		}
		return Gt;
	}
	public static void main(String[] args) throws Exception {
		Adjacent_List adjlist = GraphFactory.getAdjacentListInstance("input\\transpose_input.txt");
		System.out.println("====原图===");
		adjlist.printAllEdges();
		Adjacent_List transposeGraph = getTransposeGraph(adjlist);
		System.out.println("=====倒置图=====");
		transposeGraph.printAllEdges();
	}
}


二、邻接矩阵实现


思路:遍历二维数组,并A'[i][j] = A[j][i];

伪代码:

for i = 1 to V
	for j = 1 to V
		A'[j][i] = A[i][j];

复杂度:O(V^2);


源代码:

package C22;

import java.util.Iterator;

public class C1_3{

	public static Adjacent_Matrix getTransposeMatrix(Adjacent_Matrix g){
		Adjacent_Matrix Gt = new Adjacent_Matrix(g.getSize());
		for(int i=0;i<g.getSize();i++){
			for(int j=0;j<g.getSize();j++){
				Gt.setEdge(g.getVertexValue(j), g.getVertexValue(i), g.getElement(i, j));
			}
		}
		return Gt;
	}
	public static void main(String[] args) throws Exception {
		Adjacent_Matrix adj_matrix = GraphFactory.getAdjacentMatrixInstance("input\\transpose_input.txt");
		adj_matrix.printAllEdges();
		System.out.println("================");
		Adjacent_Matrix Gt = getTransposeMatrix(adj_matrix);
		Gt.printAllEdges();
	}
}



原文点此索引目录。感谢xiazdong君 && Google酱。这里是偶尔做做搬运工的水果君(^_^) )

### PTA 7-3 转置矩阵 #### 实验目的 通过本实验,旨在掌握稀疏矩阵的三元组表示方法及其转置操作。具体目标包括: - 学习并理解如何利用三元组表来压缩存储稀疏矩阵[^2]。 - 编写程序实现创建、显示以及两种不同的转置算法:简单转置和快速转置。 #### 方法概述 为了完成上述任务,需按照如下方式设计解决方案: 1. **数据结构的选择** 使用三元组列表作为主要的数据结构,其中每个节点包含三个部分:行索引`i`、列索引`j` 和对应的数值 `value`。这种表示形式能够有效地减少内存占用量,尤其适用于大多数元素为零的情况下的大型矩阵。 2. **功能模块划分** - 创建函数用于初始化一个给定大小的稀疏矩阵,并填充相应的非零元素; - 显示函数负责遍历整个三元组链表并将原始矩阵打印出来; - 提供两个版本的转置函数——一种基于逐项交换位置的传统做法;另一种则是优化后的高效算法,在转换过程中重新排列元素顺序以提高效率。 3. **代码示例** ```c++ #include <iostream> using namespace std; struct Triple { int row, col; double value; }; class SparseMatrix { private: static const int MAX_SIZE = 100; // 定义最大可能存在的非零元素数量 Triple elements[MAX_SIZE]; public: void create(int nRows, int nCols); void display(); void transpose(SparseMatrix &result); // 简单转置 void fastTranspose(SparseMatrix &result); // 快速转置 }; ``` 4. **测试案例准备** 准备若干不同规模和密度的输入样本进行验证,确保所编写的各个子过程都能正常工作。例如,对于特定尺寸(如8x8)且具有随机分布的小范围正整数构成的稀疏矩阵实例来进行全面检验[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值