7-6 列出连通集 (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 }
#include <bits/stdc++.h> using namespace std; int n, e; int a[101][101] = {0}; int vis[101] = {0}; int vbs[101] = {0}; void dfs(int x){//用栈模拟dfs可以避免递归栈溢出 stack<int> s; s.push(x); vis[x] = 1;//x已走过标记为1 bool f = false;//f标志初始化为false cout << "{ " << x << " "; while(!s.empty()){//当栈不为空时执行循环 f = false;//每次执行循环的第一步就是将f置为false int v = s.top();//取出栈顶元素 for(int i = 0; i < n; i++){ if(!vis[i] && a[v][i]){//当该点没有被访问过,且该点当栈顶元素有路 cout << i << " ";//打印该点 vis[i] = 1;//该点已走过 s.push(i);//将该点押入栈 f = true;//f置为true break;//跳出循环 } } if(!f){//如果该点所有的连通点已走过 s.pop();//将该点弹出 } } cout << "}" << endl; } void bfs(int x){ queue<int> q; vbs[x] = 1; q.push(x); cout << "{ "; while(!q.empty()){ int v = q.front(); cout << v << " "; q.pop();//先进先出 for(int i = 0; i < n; i++){ if(!vbs[i] && a[v][i]){ vbs[i] = 1; q.push(i); } } } cout << "}" << endl; } int main(){ cin >> n >> e; for(int i = 0; i < e; i++){ int b, c; cin >> b >> c; a[b][c] = a[c][b] = 1; } for(int i = 0; i < n; i++){ if(!vis[i]) dfs(i); } for(int i = 0; i < n; i++){ if(!vbs[i]) bfs(i); } return 0; }
下面给出递归解法(上面的bfs是伪递归)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n, e; 4 int a[101][101] = {0}; 5 int vis[101] = {0}; 6 int vbs[101] = {0}; 7 void dfs(int x){ 8 cout << " " << x; 9 for(int i = 0; i < n; i++){ 10 if(!vis[i] && a[x][i]){ 11 vis[i] = 1; 12 dfs(i); 13 } 14 } 15 } 16 void bfs(int x){ 17 queue<int> myque; 18 myque.push(x); 19 cout << "{"; 20 while(!myque.empty()){ 21 int temp = myque.front(); 22 for(int i = 0; i < n; i++){ 23 if(!vbs[i] && a[temp][i]){ 24 vbs[i] = 1; 25 myque.push(i); 26 } 27 } 28 cout << " " << temp; 29 myque.pop(); 30 } 31 cout << " }"; 32 cout << endl; 33 } 34 int main(){ 35 cin >> n >> e; 36 for(int i = 0; i < e; i++){ 37 int c, b; 38 cin >> b >> c; 39 a[b][c] = a[c][b]= 1; 40 } 41 for(int i = 0; i < n; i++){ 42 if(!vis[i]){ 43 vis[i] = 1; 44 cout << "{"; 45 dfs(i); 46 cout << " }"; 47 cout << endl; 48 } 49 50 } 51 for(int i = 0; i < n; i++){ 52 if(!vbs[i]){ 53 vbs[i] = 1; 54 bfs(i); 55 } 56 } 57 return 0; 58 }