hdu 1856并查集
很简单的并查集,不过第一次交居然超内存,把height数组改为short int就过了~~
/* * hdu1856/win.cpp * Created on: 2012-7-18 * Author : ben */ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <string> using namespace std; const int MAXM = 10000010; int myset[MAXM], mysum[MAXM]; short int myheight[MAXM]; int N, M = MAXM - 1, ans; inline int mymax(int a, int b) { return a > b ? a : b; } void initset() { for(int i = 0; i <= M; i++) { myset[i] = i; myheight[i] = 1; mysum[i] = 1; } } int myfind(int x) { while (myset[x] != x) { x = myset[x]; } return x; } void mymerge(int a, int b) { if(myheight[a] == myheight[b]) { myheight[a]++; myset[b] = a; mysum[a] += mysum[b]; ans = mymax(ans, mysum[a]); }else if(myheight[a] < myheight[b]) { myset[a] = b; mysum[b] += mysum[a]; ans = mymax(ans, mysum[b]); }else { myset[b] = a; mysum[a] += mysum[b]; ans = mymax(ans, mysum[a]); } } int main() { #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); #endif int a, b; while(scanf("%d", &N) == 1) { initset(); ans = 1; for(int i = 0; i < N; i++) { scanf("%d%d", &a, &b); a = myfind(a); b = myfind(b); if(a != b) { mymerge(a, b); } } printf("%d\n", ans); } return 0; }