有向图中反向图构造。对 tinyDG.txt 文件所表示的图,输出其邻接表表示 与 反向图的邻接表表示。类名:GraphReverse。
邻接表表示示例如下:
0:1 5
1:
2:0 3
……
程序代码如下所示:
package 算法作业;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class GraphReverse {
static int DefalutSize=20;
private Vertex NodeTable[];
private int NumVertices=0;
private int NumEdges=0;
public static ArrayList read(String path) {
ArrayList
list = new ArrayList
();
BufferedReader input = null;
try {
FileReader in = new FileReader(path);
input = new BufferedReader(in);
String ss;
try
{
while ((ss = input.readLine()) != null)
{
String[] s = (ss.split(" "));
for (int i = 0; i < s.length; i++)
{
list.add(Integer.parseInt(s[i].trim()));
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
in.close();
input.close();
}
catch (Exception e)
{
e.printStackTrace();
}
return list;
}
public void Graphadj(int vn,int v[],int en,int e[][]){
NodeTable=new Vertex[vn];
for(int i=0;i
NumVertices||v1<0)
return false;
if(v2>NumVertices||v2<0)
return false;
Edge E=new Edge(v2);
Edge p=NodeTable[v1].adj;
if(p==null)
NodeTable[v1].adj=E;
else
{
while(p.link!=null) p=p.link;
p.link=E;
}
NumEdges++;
return true;
}
public void display(){
Edge p;
for(int i=0;i
list = read(path);
int vn=list.get(0);
int en=list.get(1);
int b[][] = new int[list.get(1)][2];
int v[] = new int[list.size()];
for(int i=0;i
运行结果如下所示:
总结:
图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。
1. 邻接表的结点结构
(1)表结点结构
┌────┬───┐
│adjvex │next │
└────┴───┘
邻接表中每个表结点均有两个域:
① 邻接点域adjvex
存放与vi相邻接的顶点vj的序号j。
② 链域next
将邻接表的所有表结点链在一起。
(2)头结点结构
┌────┬─────┐
│vertex │firstedge │
└────┴─────┘
顶点vi邻接表的头结点包含两个域:
① 顶点域vertex
存放顶点vi的信息
② 指针域firstedge
vi的邻接表的头指针。
2.无向图的邻接表
对于无向图,vi的邻接表中每个表结点都对应于与vi相关联的一条边。因此,将邻接表的表头向量称为顶点表。将无向图的邻接表称为边表。
3.有向图的邻接表
对于有向图,vi的邻接表中每个表结点都对应于以vi为始点射出的一条边。因此,将有向图的邻接表称为出边表。
4.有向图的逆邻接表
在有向图中,为图中每个顶点vi建立一个入边表的方法称逆邻接表表示法。
入边表中的每个表结点均对应一条以vi为终点(即射入vi)的边。