HDU1856(並查集求最大集合)
阿新 • • 發佈:2018-12-14
有比較說明一點經驗:求最大值有時候不需要把資料求出來後遍歷。
注意:最大值的求解和比較的順序沒有關係,所以可以一邊求出資料,一邊進行比較。【即用設定全域性變數maxp的方法解決】
省去最後遍歷的步驟。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1e7+5; int pre[maxn]; int re[maxn]; int n; int a,b; int foot1,foot2,maxp; void init() { for(int i=0; i<maxn; ++i) { pre[i]=i; re[i]=1; } maxp=1; } int finds(int x) { if(x==pre[x]) return x; pre[x]=finds(pre[x]); return pre[x]; } void unions(int x,int y) { foot1=finds(x); foot2=finds(y); if(foot1!=foot2) { pre[foot2]=foot1; re[foot1]+=re[foot2]; maxp=max(re[foot1],maxp); } } int main() { while(~scanf("%d",&n)) { init(); for(int i=0; i<n; ++i) { scanf("%d%d",&a,&b); unions(a,b); } printf("%d\n",maxp); } return 0; }