1. 程式人生 > >06-圖1 列出連通集 JAVA實現

06-圖1 列出連通集 JAVA實現

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;
		}
	}
}