这道题数据有点大, 我再次 被 cin>> he cin<<out 多次超时, 改成 scanf 和 printf 后一次ac . 欲哭无泪啊!
完全是 并查集 ,模板 ,只是初始化 有点异样, 最后统计 子树元素的个数 。
#include<iostream> #include<stdio.h> #include<string> #include<string.h> #include<map> #include<math.h> #define N 10000005 #define M 100005 using namespace std; int rank[N]; int parent[N]; int sumnum[N]; int Find(int x) { if(x== parent[x]) return x; return parent[x]=Find(parent[x]); } void Union(int x, int y) { int xf=Find(x); int yf=Find(y); if(rank[xf] > rank[yf]) parent[yf]=xf; else { parent[xf]=yf; if(rank[xf] == rank[yf]) rank[yf]++; } } int main() { int m; while(scanf("%d",&m)!=EOF) { int u[M],v[M],num=1; int maxnum=0; memset(sumnum,0,sizeof(sumnum)); for(int i=0;i<m;i++) { scanf("%d%d",&u[i],&v[i]); if(u[i] > maxnum) maxnum = u[i]; if(v[i] > maxnum) maxnum = v[i]; } for( int i=1;i<=maxnum;i++) // 初始化 { parent[i]=i; rank[i]=0; } for(int i=0;i<m;i++) { if(Find(u[i]) != Find(v[i])) Union(u[i],v[i]); } for(int i=1;i<=maxnum;i++) // 统计子树元素个数 { int k=Find(i); sumnum[k]++; if(sumnum[k]>num) num=sumnum[k]; } printf("%d ",num); } return 0 ; }