import java.io.*;
import java.util.*;
public class GraphReverse {
private int vnum;
private int anum;
private boolean visited[];
private List<ArrayList<Integer>> graphListS;
private List<ArrayList<Integer>> graphListF;
public GraphReverse(int vnum,int anum,List<ArrayList<Integer>> graphListS,List<ArrayList<Integer>> graphListF){
this.vnum=vnum;
this.anum=anum;
this.graphListS=graphListS;
this.graphListF=graphListF;
visited=new boolean[vnum];
}
public static void main(String[] args) {
String path="d:/tinyDG.txt";
try{
Scanner in=new Scanner(new File(path));
List<ArrayList<Integer>> graphListS=new ArrayList<ArrayList<Integer>>();
List<ArrayList<Integer>> graphListF=new ArrayList<ArrayList<Integer>>();
int vnum=in.nextInt();
int anum=in.nextInt();
for(int i=0;i<vnum;i++){
graphListS.add(new ArrayList<Integer>());
graphListF.add(new ArrayList<Integer>());
}
for(int i=0;i<anum;i++){
int u=in.nextInt();
int v=in.nextInt();
if(!graphListS.get(u).contains(v)){
graphListS.get(u).add(v);
}
if(!graphListF.get(v).contains(u)){
graphListF.get(v).add(u);
}
}
GraphReverse graph1=new GraphReverse(vnum, anum, graphListS,null);
System.out.println("有向图的邻接表的结果是:");
graph1.ff(vnum/2+1,graphListS);
GraphReverse graph2=new GraphReverse(vnum, anum, null,graphListF);
System.out.println("有向图的反向图的邻接表结果是:");
graph2.ff(1,graphListF);
}catch (Exception e) {
e.printStackTrace();
}
}
private void ff(int v,List<ArrayList<Integer>> graphList){
Queue<Integer> que = new LinkedList<Integer>();
que.offer(v);
while (!que.isEmpty()) {
v = que.poll();
System.out.print(v+":");
visited[v] = true;
for (int i = 0; i <graphList.get(v).size(); i++) {
int k=graphList.get(v).get(i);
System.out.print(k+" ");
if (!visited[k]){
que.offer(k);
visited[k] = true;
}
}
System.out.println();
}
}
}
有向图的邻接表的结果是:
7:9 6
9:10 11
6:0 8 4 9
10:12
11:12 4
0:1 5
8:6
4:2 3
12:9
1:
5:4
2:3 0
3:2 5
有向图的反向图的邻接表结果是:
1:0
0:6 2
6:8 7
2:4 3
8:6
7:
4:11 5 6
3:2 4
11:9
5:3 0
9:12 7 6
12:11 10
10:9