PTA 7-6 列出连通集(深搜+广搜)

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

输入格式:

输入第1行给出2个整数N(0<N10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

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

题意

如上

题解

直接跑DFS深搜和BFS深搜,模板题,注意标记访问Vis

代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int G[15][15],Vis[15];
 5 int n,m;
 6 void dfs(int u)
 7 {
 8     printf(" %d",u);
 9     for(int i=0;i<n;i++)
10         if(!Vis[i]&&G[u][i])
11             Vis[i]=1,dfs(i);
12 }
13 void bfs(int u)
14 {
15     queue<int> Q;
16     Q.push(u);
17     while(!Q.empty())
18     {
19         u=Q.front();Q.pop();
20         printf(" %d",u);
21         for(int i=0;i<n;i++)
22             if(!Vis[i]&&G[u][i])
23                 Vis[i]=1,Q.push(i);
24     }
25 }
26 int main()
27 {
28     scanf("%d%d",&n,&m);
29     for(int i=0;i<m;i++)
30     {
31         int u,v;
32         scanf("%d%d",&u,&v);
33         G[u][v]=G[v][u]=1;
34     }
35     memset(Vis,0,sizeof(Vis));
36     for(int i=0;i<n;i++)
37         if(!Vis[i])
38         {
39             printf("{");
40             Vis[i]=1;
41             dfs(i);
42             printf(" }
");
43         }
44 
45     memset(Vis,0,sizeof(Vis));
46     for(int i=0;i<n;i++)
47         if(!Vis[i])
48         {
49             printf("{");
50             Vis[i]=1;
51             bfs(i);
52             printf(" }
");
53         }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/taozi1115402474/p/8545383.html