算法题

    技术2022-07-11  102

    思路: 这是一个并查集问题。

    接下来我们用C++进行编程:

    #include <bits/stdc++.h> using namespace std; const int MAX_N = 2e5 + 5; int par[MAX_N], cnt[MAX_N]; unordered_map<int ,int> umap; void init(int n) { for(int i = 0; i < n; i++) { par[i] = i; cnt[i] = 1; } } //查找根结点 int find(int x) { if(par[x] == x) return x; else return par[x] = find(par[x]); } //合并 void joint(int x, int y) { if(find(x) == find(y)) return; cnt[par[y]] += cnt[par[x]]; par[par[x]] = par[y]; } int main(){ int T; cin >> T; while(T--) { int n; cin >> n; int x, y; init(2 * n + 5); umap.clear(); int cntv = 0; for(int i = 0; i < n; i++) { cin >> x >> y; if(umap.find(x) == umap.end()) { ++cntv; umap[x] = cntv; } if(umap.find(y) == umap.end()) { ++cntv; umap[y] = cntv; } joint(umap[x], umap[y]); } int result = 0; for(int i = 0; i <= cntv; i++) result = max(result, cnt[find(i)]); cout << result << endl; } return 0; }
    Processed: 0.020, SQL: 9