7-6 列出连通集 (25 分)

╰+攻爆jí腚メ 2022-05-03 11:58 227阅读 0赞

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

输入格式:

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

输出格式:

按照”{ v1 v2 … vk }“的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

输入样例:

  1. 8 6
  2. 0 7
  3. 0 1
  4. 2 0
  5. 4 1
  6. 2 4
  7. 3 5

输出样例:

  1. { 0 1 4 2 7 }
  2. { 3 5 }
  3. { 6 }
  4. { 0 1 2 7 4 }
  5. { 3 5 }
  6. { 6 }
  7. #include<bits/stdc++.h>
  8. using namespace std;
  9. int n,e;
  10. int a[101][101]={
  11. 0};
  12. int vis[101]={
  13. 0};
  14. int vbs[101]={
  15. 0};
  16. void dfs(int x){
  17. stack<int>s;
  18. s.push(x);
  19. vis[x]=1;
  20. bool f=false;
  21. cout<<"{ "<<x<<" ";
  22. while(!s.empty()){
  23. f=false;
  24. int v=s.top();
  25. for(int i=0;i<n;i++){
  26. if(!vis[i]&&a[v][i]){
  27. cout<<i<<" ";
  28. vis[i]=1;
  29. s.push(i);
  30. f=true;
  31. break;
  32. }
  33. }
  34. if(!f){
  35. s.pop();
  36. }
  37. }
  38. cout<<"}"<<endl;
  39. }
  40. void bfs(int x){
  41. queue<int>q;
  42. vbs[x]=1;
  43. q.push(x);
  44. cout<<"{ ";
  45. while(!q.empty()){
  46. int v=q.front();
  47. cout<<v<<" ";
  48. q.pop();
  49. for(int i=0;i<n;i++){
  50. if(!vbs[i]&&a[v][i]){
  51. vbs[i]=1;
  52. q.push(i);
  53. }
  54. }
  55. }
  56. cout<<"}"<<endl;
  57. }
  58. int main()
  59. {
  60. cin>>n>>e;
  61. for(int i=0;i<e;i++){
  62. int b,c;
  63. cin>>b>>c;
  64. a[b][c]=a[c][b]=1;
  65. }
  66. for(int i=0;i<n;i++){
  67. if(!vis[i])dfs(i);
  68. }
  69. for(int i=0;i<n;i++){
  70. if(!vbs[i])bfs(i);
  71. }
  72. }

发表评论

表情:
评论列表 (有 0 条评论,227人围观)

还没有评论,来说两句吧...

相关阅读

    相关 06-图1 列出连通

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

    相关 列出连通的邻接表解题

    [列出连通集的邻接表解题][Link 1] 也许有许多人像我一样,一开始用邻接表做这题,结果发现深搜的顺序是错的导致这题出不来。很多人于是放弃了邻接表,利用邻接矩阵,显然方便