最後會有幾個“朋友圈子”,求最大的朋友圈的人數。
#include#include #include #include using namespace std; int r[30005]; int x[30010]; int init(int n)/// 初始化 { for(int i=1;i<=n;i++) r[i]=i; } int find_(int x) ///尋找根 { int n=x,t; while(r[x]!=x) x=r[x]; while(n!=r[n]){ /// 路徑壓縮 路過的點全部指向根 t=r[n]; r[n]=x; n=r[n]; } return x; } int cmp(int x,int y) { return x>y; } int main() { int n,m,i,T,a,b; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); init(n); while(m--){ scanf("%d%d",&a,&b); int aa=find_(a); int bb=find_(b); if(aa!=bb)/// 合並 r[aa]=bb; } memset(x,0,sizeof(x)); for(i=1;i<=n;i++) x[find_(i)]++;/// 哈希,在一個朋友圈裡,則find_(i)相同, 累加 int ans=0; for(i=1;i<=n;i++) if(ans