PTA 列出连通集 (25分)

PTA 列出连通集 (25分)

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0 输出格式:

按照"{ 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 }

DFS通俗点说就是一条路不走到底不回头,到底后回溯到分歧点继续走,直到全部走完,而BFS是按层来的,先搜索一个点的全部关联点,再搜索第一个关联点的全部关联点,直到全部搜一遍,和二叉树的层序遍历有一定相似之处。
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-8
#define MOD 1000000007
typedef long long ll;
using namespace std;
int vec[11][11];
int visit[11];
int num1, num2;
queue<int> q;
void dfs(int n) {
 cout << " " << n;
 visit[n] = 1;
 for (int i = 0; i < num1; i++) {
  if ((vec[n][i] == 1||vec[i][n]==1) && visit[i] == 0) {
   dfs(i);
  }
 }
}
void bfs(int n) {
 q.push(n);
 while (!q.empty()) {
  cout << " " << q.front();
  visit[q.front()] = 1;
  for (int i = 0; i < num1; i++) {
   if ((vec[q.front()][i] == 1 || vec[i][q.front()] == 1) && visit[i] == 0) {
    q.push(i);
    visit[i] = 1;
   }
  }
  q.pop();
 }
}
int main(void) {
 cin >> num1 >> num2;
 memset(vec, 0, sizeof(vec));
 while (num2--) {
  int a, b;
  cin >> a >> b;
  vec[a][b] = 1;
  vec[b][a] = 1;
 }
 memset(visit, 0, sizeof(visit));
 for (int i = 0; i < num1; i++) {
  if (visit[i] == 0) {
   cout << "{";
   dfs(i);
   cout << " }" << endl;
  }
 }
 memset(visit, 0, sizeof(visit));
 for (int i = 0; i < num1; i++) {
  if (visit[i] == 0) {
   cout << "{";
   bfs(i);
   cout << " }" << endl;
  }
 }
}

你可能感兴趣的:(PTA 列出连通集 (25分))