06-圖1 列出連通集 JAVA實現
阿新 • • 發佈:2018-11-02
06-圖1 列出連通集 JAVA實現
題目
給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N−1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。
輸入格式:
輸入第1行給出2個整數N(0<N≤10)和E,分別是圖的頂點數和邊數。隨後E行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。
輸出格式:
按照"{ v
1
v
2
… v
k
}"的格式,每行輸出一個連通集。先輸出DFS的結果,再輸出BFS的結果。
輸入樣例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
輸出樣例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
public class ConnectedSet { private static int Vex; private static int Edge; private static int[][] node=new int[Vex][Vex]; private static boolean[] visit=new boolean[Vex]; public static void main(String[] args) { Scanner sc=new Scanner(System.in); Vex=sc.nextInt(); //頂點個數 Edge=sc.nextInt(); //邊條數 node =new int[Vex][Vex]; //定義一個矩陣記錄頂點之間是否連通 visit=new boolean[Vex]; //記錄是否被訪問過 for(int i=0;i<Vex;i++) { //矩陣初始化 for(int j=0;j<Vex;j++) { node[i][j]=0; } } int tmp_v1; int tmp_v2; for(int k=0;k<Edge;k++) { //讀取頂點之間的連線關係; tmp_v1=sc.nextInt(); tmp_v2=sc.nextInt(); node[tmp_v1][tmp_v2]=1; node[tmp_v2][tmp_v1]=1; } reset(visit); //初始化訪問,全部設定為false //使用深度優先搜尋,輸出 for(int d=0;d<Vex;d++) { //保證每個頂點都被訪問過 if(visit[d]==false) { System.out.print("{ "); DFS(d); System.out.println("}"); } } reset(visit); //重新初始化為false //使用廣度優先搜尋,輸出 for(int v=0;v<Vex;v++) { if(!visit[v]) { System.out.print("{ "); BFS(v); System.out.println("}"); } } } public static void BFS(int v) { visit[v]=true; //頂點被訪問 Queue<Integer> queue=new LinkedList<>(); //使用佇列存放相鄰頂點 queue.add(v); //頂點放入佇列 while(!queue.isEmpty()) { int tmp=queue.poll(); // 彈出頂點 System.out.print(tmp+" "); for(int n=0;n<Vex;n++) { //遍歷相鄰頂點 if(node[tmp][n]!=0 && visit[n]==false) { queue.add(n); //相鄰頂點加入到佇列; visit[n]=true; //已被訪問 } } } } public static void DFS(int v) { visit[v]=true; //訪問頂點 System.out.print(v+" "); for(int m=0;m<Vex;m++) { //使用遞迴不斷訪問相鄰頂點; if(node[v][m]!=0 && visit[m]==false) { DFS(m); } } } public static void reset(boolean[] visit) { //初始化visit for(int c=0;c<visit.length;c++) { visit[c]=false; } } }