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

简介: 7-2 列出连通集 (25分)

7-2 列出连通集 (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 }


题解


创建二维矩阵,输入的边的值为1,没有边为0,再利用bfs,dfs进行输出

编写深度优先搜索函数,广度优先搜索函数,再通过函数调用进行输出。


伪代码


Dfs算法
{
  访问过的点 = 1;
  cout << " " << a;
  for (int i = 0; i < N; i++)
  {
    if (其他点到这个点有边并且该点未被访问过)//该点未访问过并且其他点到这个点有边
    {
      Dfs递归
    }
  }
}
Bfs算法
{
  创建队列
  将点压入队列;
  访问过该点 = 1;
  while (队列不为空) 
  {
    设an为队首元素;
    弹出队首元素;
    将an输出;
    for (int i = 0; i < N; i++)
    {
      if (该点未访问过并且该点与其他点有边) 
      {
        标记该点为1,被访问过
        将该点压入队列
      }
    }
  }
}


代码


#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<vector>
#include<stack>
#include<math.h>
#include<queue>
using namespace std;
const int inf = 99999;
const int maxn = 12;
int n, e, G[maxn][maxn];
bool vis[maxn], inq[maxn];
// 深度优先搜索
void DFS(int u)
{
  vis[u] = true;
  cout << " " << u;
  for (int v = 0; v < n; v++)
  {
    if (vis[v] == false && G[u][v] != inf)
    {
      DFS(v);
    }
  }
}
void DFSTravel()
{
  for (int u = 0; u < n; u++)
  {
    if (vis[u] == false)  // 避免没有通路情况
    {
      cout << "{";
      DFS(u);
      cout << " }\n";
    }
  }
}
// 广度优先搜索
void BFS(int u)
{
  queue<int> q;
  q.push(u);
  inq[u] = true;  // 访问过标记true
  while (!q.empty())
  {
    int temp = q.front();
    cout << " " << temp;
    q.pop();
    for (int v = 0; v < n; v++)
    {
      if (inq[v] == false && G[temp][v] != inf)
      {
        q.push(v);
        inq[v] = true;
      }
    }
  }
}
void BFSTravel()
{
  for (int u = 0; u < n; u++)
  {
    if (inq[u] == false)
    {
      cout << "{";
      BFS(u);
      cout << " }\n";
    }
  }
}
int main()
{
  fill(G[0], G[0] + maxn * maxn, inf);
  cin >> n >> e;
  for (int i = 0; i < e; i++)
  {
    int a, b;
    cin >> a >> b;
    G[a][b] = G[b][a] = 1;  // 通路赋值为1
  }
  DFSTravel();  // 深度优先搜索
  BFSTravel();  // 广度优先搜索
  return 0;
}
相关文章
|
6月前
【每日一题Day243】LC1595连通两组点的最小成本 | 状态压缩dp
【每日一题Day243】LC1595连通两组点的最小成本 | 状态压缩dp
57 0
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(二)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
|
6月前
|
人工智能 BI 测试技术
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(一)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
|
6月前
|
算法 测试技术 C#
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(三)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
|
算法 C++
探索最小生成树:连通世界的最短纽带
生活中,我们常常需要在一组地点之间建立联系,这些联系可能是道路、管道、电缆等。然而,资源有限,成本宝贵。在这种情况下,如何以最小的代价将这些地点连接起来,成为了一个关键问题。这就引出了图论中的一个重要概念:最小生成树(Minimum Spanning Tree,MST)。本文将通过一个日常生活的案例,详细探讨最小生成树的概念、应用。
82 0
|
6月前
leetcode-1319:连通网络的操作次数
leetcode-1319:连通网络的操作次数
35 0
|
6月前
【每日一题Day311】LC1761一个图中连通三元组的最小度数 | 枚举
【每日一题Day311】LC1761一个图中连通三元组的最小度数 | 枚举
48 0
|
云安全 运维 监控
如何将两个主机安全地连接起来?新解法
如何将两个主机安全地连接起来?新解法
167 0
7-170 列出连通集 (25 分)
7-170 列出连通集 (25 分)
117 0
7-201 列出连通集 (25 分)
7-201 列出连通集 (25 分)
111 0