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<stdio.h> #include<queue> #include<string.h> #include<iostream> using namespace std; int N, E, map[20][20], flag[20]; void DFS(int n) { if (flag[n] == 1)return; cout << " " << n; flag[n] = 1; for (int i = 0; i < N; i++) if (map[n][i] == 1 && flag[i] == 0) DFS(i); } void BFS(int n) { queue<int>que; que.push(n); flag[n] = 1; while (!que.empty()){ int temp = que.front(); cout <<" "<<temp; for (int i = 0; i < N; i++) { if (flag[i] == 1) continue; if (map[temp][i] == 1) { que.push(i); flag[i] = 1; } } que.pop(); } } int main() { memset(map, 0, sizeof(int)* 400); cin >> N >> E; while (E--){ int a, b; cin >> a >> b; map[a][b] = 1; map[b][a] = 1; } memset(flag, 0, sizeof(int)* 20); for (int i = 0; i < N; i++) //进行DFS遍历 { if (flag[i] == 1)continue; cout << "{"; DFS(i); cout << " }" << endl; } memset(flag, 0, sizeof(int)* 20); for (int i = 0; i < N; i++) //进行BFS遍历 { if (flag[i] == 1)continue; cout << "{"; BFS(i); cout << " }" << endl; } return 0; }