对下图所表示的图,输出其邻接表表示 与 反向图的邻接表表示。
程序:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class GraphReverse {
public static void main(String... args) throws FileNotFoundException{
GraphReverse gr = new GraphReverse();
//获取边数
int arcNum = gr.getNum("tinyDG.txt");
//获取顶点数
Scanner scan = new Scanner(new File("tinyDG.txt"));
int vertex = scan.nextInt();
//定义二维数组
int[][] Data = new int[arcNum][2];
int[][] reverseData = new int[arcNum][2];
scan.nextLine();
scan.nextLine();
//初始化二维数组
int line = 0;
while(scan.hasNextInt()){
Data[line][0] = scan.nextInt();
Data[line][1] = scan.nextInt();
reverseData[line][1] = Data[line][0];
reverseData[line][0] = Data[line][1];
line++;
}
scan.close();
//输出原图的邻接表
System.out.println("有向图的邻接表如下:");
ALGraph(arcNum, vertex, Data);
//输出反向图的邻接表
System.out.println("反向图的邻接表如下:");
ALGraph(arcNum, vertex, reverseData);
}
//生成邻接表
private static void ALGraph(final int arcNum, final int vertex, int[][] Data) {
List<Integer> list = new ArrayList<>();
for(int n=0;n<vertex;n++){
System.out.print(n+": ");
for(int i=0;i<arcNum;i++){
if(n==Data[i][0]){
list.add(Data[i][1]);
}
}
int elementCount = list.size();
int[] arraySort = new int[elementCount];
for(int j=0;j<elementCount;j++){
arraySort[j] = (int)list.get(j);
}
list.clear();
GraphReverse gr = new GraphReverse();
arraySort = gr.sortArray(arraySort);
for(int j=0;j<elementCount;j++){
System.out.print(arraySort[j]+" ");
}
System.out.println();
}
}
//获取边数的方法
public int getNum(String filePath) throws FileNotFoundException{
int arcNum=0;
Scanner scan= new Scanner(new File("tinyDG.txt"));
while(scan.hasNextLine()){
scan.nextLine();
arcNum++;
}
scan.close();
return arcNum-2;
}
//顶点从小到大排序
public int[] sortArray(int[] array){
for(int i=1,n=array.length;i<n;i++)
for(int j=0;j<n-i;j++){
if(array[j]>array[j+1]){
int t = array[j];
array[j] = array[j+1];
array[j+1] = t;
}
}
return array;
}
}
程序运行结果: