有 1000 萬個男孩(編號 1~10⁷),給出 n (≤10⁵) 對直接好友關係。好友關係具有傳遞性(A-B, B-C ⇒ A-C)。選擇一個最大的群體,使群體內任意兩人直接或間接為好友。輸出最大群體人數。
經典並查集應用:
const int MAXN = 10000005; // 題目上限 10^7,但實際只需映射出現的節點
int fa[MAXN], sz[MAXN];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void unite(int a, int b) {
a = find(a); b = find(b);
if (a != b) {
fa[a] = b;
sz[b] += sz[a];
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
// 僅初始化出現的節點(或用 map 映射壓縮座標)
// 這裡簡化:假設節點號 ≤ 1000000
int max_id = 0;
vector> edges(n);
for (int i = 0; i < n; ++i) {
scanf("%d%d", &edges[i].first, &edges[i].second);
max_id = max(max_id, max(edges[i].first, edges[i].second));
}
for (int i = 1; i <= max_id; ++i) {
fa[i] = i; sz[i] = 1;
}
for (auto &e : edges) unite(e.first, e.second);
int ans = 0;
for (int i = 1; i <= max_id; ++i)
if (fa[i] == i) ans = max(ans, sz[i]);
printf("%d\n", ans);
}
}
// 輸入1:
4
1 2
3 4
5 6
1 6
// 集合:{1,2,5,6} size=4, {3,4} size=2 → 輸出 4
// 輸入2:
4
1 2
3 4
5 6
7 8
// 四個 size=2 集合 → 輸出 2