2 条题解
-
0
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
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
- 上传者