原題鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1856
簡單的並查集的運用,如下:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<iostream> 4 #include<algorithm> 5 const int Max_N = 100050; 6 struct UnionFind{ 7 int ans, par[Max_N], rank[Max_N], num[Max_N]; 8 inline void init(int n){ 9 ans = 1; 10 for (int i = 1; i < Max_N; i++){ 11 par[i] = i; 12 rank[i] = 0; 13 num[i] = 1; 14 } 15 } 16 inline int find(int x){ 17 while (x != par[x]){ 18 x = par[x] = par[par[x]]; 19 } 20 return x; 21 } 22 inline void unite(int x, int y){ 23 x = find(x), y = find(y); 24 if (x == y) return; 25 if (rank[x] < rank[y]){ 26 par[x] = y; 27 num[y] += num[x]; 28 num[x] = 0; 29 ans = std::max(num[y], x); 30 } else { 31 par[y] = x; 32 num[x] += num[y]; 33 num[y] = 0; 34 ans = std::max(num[x], ans); 35 if (rank[x] == rank[y]) rank[x]++; 36 } 37 } 38 }rec; 39 int main(){ 40 #ifdef LOCAL 41 freopen("in.txt", "r", stdin); 42 freopen("out.txt", "w+", stdout); 43 #endif 44 int n, a, b; 45 while (~scanf("%d", &n)){ 46 rec.init(n); 47 for (int i = 0; i < n; i++){ 48 scanf("%d %d", &a, &b); 49 rec.unite(a, b); 50 } 51 printf("%d\n", rec.ans); 52 } 53 return 0; 54 } View Code