2 条题解

  • 0
    @ 2025-7-20 11:53:41

    dfs方法:

    #include <bits/stdc++.h>
    using namespace std;
    
    vector<vector<int>> adj;  // 邻接表,存储每个人的“同一家”关系
    vector<bool> vis;         // 访问标记数组
    int dfs(int u) {
        // 从节点 u 开始,一次递归统计当前连通分量(家庭)的人数
        vis[u] = true;
        int cnt = 1;  // 统计自己
    
        // 遍历所有邻居
        for (int v : adj[u]) {
            if (!vis[v]) {
                cnt += dfs(v);  // 递归访问,累加子节点的计数
            }
        }
        return cnt;
    }
    
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n, k;
        cin >> n >> k;           // 读入总人数 n 和关系数 k
    
        adj.assign(n+1, {});     // 初始化邻接表(1..n)
        vis.assign(n+1, false);  // 初始化访问标记
    
        // 读入 k 条关系,构造无向图
        for (int i = 0; i < k; i++) {
            int a, b;
            cin >> a >> b;
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
    
        int familyCnt = 0;  // 家庭数量
        int maxSize   = 0;  // 最大家庭人数
    
        // 对每个人做一次 DFS
        for (int i = 1; i <= n; i++) {
            if (!vis[i]) {
                // 新发现一个家庭
                familyCnt++;
                // 以 i 为起点,递归统计这个家庭的人数
                int sz = dfs(i);
                // 更新最大规模
                maxSize = max(maxSize, sz);
            }
        }
    
        // 输出结果:家庭总数 和 最大家庭人数
        cout << familyCnt << " " << maxSize << "\n";
        return 0;
    }
    
    
    • 0
      @ 2025-7-20 11:48:09

      bfs邻接表:

      #include <bits/stdc++.h>
      using namespace std;
      
      int main(){
          ios::sync_with_stdio(false);
          cin.tie(nullptr);
      
          int n, k;
          cin >> n >> k;                  // 读入总人数 n 和关系数 k
      
          // 建图:邻接表存储每个人的“同一家”关系
          vector<vector<int>> adj(n+1);
          for(int i = 0; i < k; i++){
              int a, b;
              cin >> a >> b;
              adj[a].push_back(b);
              adj[b].push_back(a);
          }
      
          vector<bool> vis(n+1, false);   // 访问标记数组
          queue<int> q;                   // BFS 用的队列
      
          int familyCnt = 0;              // 家庭数量
          int maxSize = 0;                // 最大家庭人数
      
          // 对每个人做一次 BFS,统计连通分量
          for(int i = 1; i <= n; i++){
              if(vis[i]) continue;        // 已经归入某个家庭,跳过
      
              // 新发现一个家庭
              familyCnt++;
              int sz = 0;
      
              // 从 i 开始 BFS
              vis[i] = true;
              q.push(i);
              while(!q.empty()){
                  int u = q.front(); q.pop();
                  sz++;                  // 本家庭成员数 +1
      
                  // 扩展到所有邻居
                  for(int v : adj[u]){
                      if(!vis[v]){
                          vis[v] = true;
                          q.push(v);
                      }
                  }
              }
      
              // 更新最大家庭规模
              maxSize = max(maxSize, sz);
          }
      
          // 输出:家庭总数 和 最大家庭规模
          cout << familyCnt << " " << maxSize << "\n";
          return 0;
      }
      
      
      • 1

      信息

      ID
      840
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      递交数
      13
      已通过
      2
      上传者