列出连通集 (25分)
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v1 v2 ... vk }"的格式,每行输出一个连通集。先输出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 }
Java代码如下:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class ConnectedSet {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int vertex = sc.nextInt();
int edge = sc.nextInt();
int[][] map = new int[vertex][vertex];
int[] visited = new int[vertex];
int tmpVertex1, tmpVertex2;
// 邻接矩阵初始化
for (int i = 0; i < edge; i++) {
tmpVertex1 = sc.nextInt();
tmpVertex2 = sc.nextInt();
map[tmpVertex1][tmpVertex2] = 1;
map[tmpVertex2][tmpVertex1] = 1;
}
// 深度优先搜索
for (int i = 0; i < vertex; i++) {
if (visited[i] != 1) {
System.out.print("{ ");
visited[i] = 1;
dfs(i, vertex, visited, map);
System.out.println("}");
}
}
//广度优先搜索
reset(visited,vertex);
for (int i = 0; i < vertex; i++) {
if (visited[i] != 1) {
Queue<Integer> queue = new LinkedList<Integer>();
System.out.print("{ ");
visited[i] = 1;
queue.add(i);
System.out.print(i + " ");
while(!queue.isEmpty())
bfs(queue, vertex, visited, map);
System.out.println("}");
}
}
sc.close();
}
/**
* 广度优先搜索 使用Queue队列
*/
public static void bfs(Queue<Integer> queue, int vertex, int[] visited, int[][] map) {
int root = queue.poll();
for (int j = 0; j < vertex; j++) {
if (visited[j] != 1 && map[root][j] == 1) {
visited[j] = 1;
queue.add(j);
System.out.print(j + " ");
}
}
}
/**
* 深度优先搜索 注意:当访问一个vertex后,要将该vertex对应的visited置为1;
*/
public static void dfs(int root, int vertex, int[] visited, int[][] map) {
System.out.print(root + " ");
for (int i = 0; i < vertex; i++) {
if (visited[i] != 1 && map[root][i] == 1) {
visited[i] = 1;
dfs(i, vertex, visited, map);
}
}
}
/**
* visited矩阵初始化
*/
public static void reset(int[] visited,int N){
for(int i=0;i<N;i++){
visited[i]=0;
}
}
}