一、邻接表实现



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

邻接表实现伪代码:

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酱。这里是偶尔做做搬运工的水果君(^_^)

《算法导论》习题解答 Chapter 22.1-3(转置图)的更多相关文章

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

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

  2. 《算法导论》习题解答 Chapter 22.1-5(求平方图)

    一.邻接矩阵实现 思路:如果是邻接矩阵存储,设邻接矩阵为A,则A*A即为平方图,只需要矩阵相乘即可: 伪代码: for i=1 to n for j=1 to n for k=1 to n resul ...

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

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

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

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

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

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

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

  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. 原生JS修改标签样式为带阴影效果

    代码如下: JS部分 //点击时候,改变样式 function GetCategoryInfo(value) { var getInfo = value.toString().split(','); ...

  2. 使用struts2实现文件上传

    action中 private File file;//文件 private String fileFileName;//文件名字 固定格式name+FileName private String f ...

  3. Linux下修改hostname

    我维护两三个机房的数十台机器,开发用机器,运营用机器,自己工作机器也是ubuntu,有时开很多ssh,干的还是同样的事情,很容易搞混.所以需要一目了然的知道某台机器的情况,避免犯晕.这就需要修改主机名 ...

  4. CHM文件无法查看内容解决办法

    http://www.cnblogs.com/skey_chen/archive/2011/05/24/2055538.html 从网上下载了一份CHM格式的文档,打开时左侧菜单出来了,但右边显示如下 ...

  5. 可拖拽GridView代码解析

    本片学习笔记是对eoe网上一个项目代码的解读.详细项目作者的博客例如以下:http://blog.csdn.net/vipzjyno1/article/details/26514543.项目源代码下载 ...

  6. 局域网两台笔记本如何使用svn

    前几天我要和朋友一起开发一个网站,但是都是两台笔记本,连局域网搞的很麻烦,后来就用了git,今天突然想到要用svn,就在网上找了这个办法,结果一试便可以了,很开心 很感谢楼主,下面是我做的步骤绝对给力 ...

  7. 查询(c语言实现)

    /* * Describe:这是一个简单的查询程序 * Date: 2013/12/7 */ #include <stdio.h> #include <stdlib.h> #d ...

  8. [MFC]MFC中OnDraw与OnPaint的区别

    问题 问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同? OnDraw()和OnPaint()好象兄弟俩,因为它们的工作 ...

  9. Swift2.0 中的String(一):常用属性

    字符串算是平常用的比较多.花样也比较多的一个类型,昨天有空把相关的一些常用操作都写了一遍,总结出来.其实iOS里面的字符串更复杂,还有NSString系列等等,那些API太多将来需要用的时候再慢慢学. ...

  10. linux 文件系统的管理 (硬盘) 工作原理

    一.系统在初始化时如何识别硬盘 1.系统初始时根据MBR的信息来识别硬盘,其中包括了一些执行文件就来载入系统,这些执行文件就是MBR里前面446bytes里的boot loader 程式,而后面的16 ...