这题。。刚开始看那个数字有点大,以为开不了那么大的数组(其实只有一千万,可以开,,被眼睛给欺骗了。。),结果用了一些容器来优化,结果发现所谓的“优化”过后时间花费还更多了,多了一倍, 虽然空间复杂度提高了10倍。。真是。果然是一个时间复杂度换空间复杂度的活生生的案例啊。。
这题给我的收获:
1.10000000的数组可以开。
2.合并时,if(x == y) return; 最好加上,否则突然浪费时间,还有可能超时。
代码:( 直接开数组版 78672KB 406ms )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> int fa[10000001],rank[10000001]; int findset(int x) { if(x != fa[x]) fa[x] = findset(fa[x]); return fa[x]; } void unionset(int x,int y) { x=findset(x); y=findset(y); if(x==y) return; if(rank[x] >= rank[y]) { fa[y] = x; rank[x] += rank[y]; } else if(rank[x] < rank[y]) { fa[x] = y; rank[y] += rank[x]; } } int main() { int n,i,j,maxi,a,b; while(scanf("%d",&n)!=EOF) { for(i=0;i<10000000;i++) { fa[i]=i; rank[i]=1; } for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); unionset(a,b); } maxi=rank[0]; for(i=1;i<10000000;i++) if(maxi<rank[i]) maxi=rank[i]; printf("%d ",maxi); } return 0; }
代码:( 容器优化版 7576KB 890ms )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <utility> #include <cstdlib> using namespace std; #define N 100100 map<int,int> fa,num; vector<int> v,v2; struct node { int a,b; }pa[N]; void makeset() { fa[v[0]] = v[0]; num[v[0]] = 1; v2.push_back(v[0]); for(int i=1;i<v.size();i++) { if(v[i] != v[i-1]) { v2.push_back(v[i]); fa[v[i]] = v[i]; num[v[i]] = 1; } } } int findset(int x) { if(x != fa[x]) { fa[x] = findset(fa[x]); } return fa[x]; } void unionset(int a,int b) { int x = findset(a); int y = findset(b); if(x == y) return; if(num[x] >= num[y]) { fa[y] = x; num[x] += num[y]; } else { fa[x] = y; num[y] += num[x]; } } int main() { int n,i; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { scanf("%d%d",&pa[i].a,&pa[i].b); v.push_back(pa[i].a); v.push_back(pa[i].b); } sort(v.begin(),v.end()); makeset(); for(i=1;i<=n;i++) { unionset(pa[i].a,pa[i].b); } int maxi = -1000000; for(i=0;i<=v2.size();i++) { if(fa[v2[i]] == v2[i]) { if(num[v2[i]] > maxi) maxi = num[v2[i]]; } } printf("%d ",maxi); } return 0; }