有向图中反向图构造。对tinyDG.txt(http://pan.baidu.com/s/1o6jWtcA)文件所表示的图,输出其邻接表表示 与 反向图的邻接表表示。
邻接表表示示例如下:
0:1 5
1:
2:0 3
……
共三个类,代码如下:
Vertex类:
package 有向图邻接表表示及反向图构造;
public class Vertex {
int data;
Edge adj;
}
Edge类:
package 有向图邻接表表示及反向图构造;
public class Edge {
int dest;
Edge link;
Edge(int D)
{
dest=D;
link=null;
}
}
GraphReverse类:
package 有向图邻接表表示及反向图构造;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class GraphReverse {
public static void main(String args []){
String path = "F:\\tinyDG.txt";
ArrayList<Integer> 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<vn;i++){//顶点数组初始化
v[i]=i;
}
//反向图的邻接表
/*int k=(list.get(1)+1)*2-1; //最后一个
for(int i=0;i<list.get(1);i++){
for(int j=0;j<2;j++){
b[i][j]=list.get(k);
k--;
}
}*/
//图的邻接表
int k=2; //最后一个
//将一位数组的值加入到二维数组中
for(int i=0;i<list.get(1);i++){
for(int j=0;j<2;j++){
b[i][j]=list.get(k);
k++;
}
}
GraphReverse G=new GraphReverse();
G.Graphadj(vn, v, en, b);
G.display();
}
static int DefalutSize=20;
private Vertex NodeTable[];
private int NumVertices=0;
private int NumEdges=0;
public void Graphadj(int vn,int v[],int en,int e[][]){
NodeTable=new Vertex[vn];
for(int i=0;i<vn;i++){
InsertVertex(v[i]);
}
for(int i=0;i<en;i++)
{
InsertEdge(e[i][0],e[i][1]);
}
}
public boolean InsertVertex(int vertex)
{
Vertex t=new Vertex();
t.data=vertex;
t.adj=null;
NodeTable[NumVertices]=t;
NumVertices++;
return true;
}
public boolean InsertEdge(int v1,int v2){
if(v1>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<NumVertices;i++){
System.out.print(NodeTable[i].data+":");
p=NodeTable[i].adj;
while(p!=null)
{
System.out.print(p.dest+" ");
p=p.link;
}
System.out.println();
}
}
public static ArrayList read(String path) {
ArrayList<Integer> list = new ArrayList<Integer>();
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())); // 将String
// s中的内容添加到动态数组中
}
}
} catch (IOException e) {
e.printStackTrace();
}
in.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
结果如下: