对前辈代码的小小见解
#include <iostream>
using namespace std;
const int N = 1e4+10;
int f[N];
bool visit[N];
int find(int x){ //寻找祖节点
if(f[x] != x) f[x]=find(f[x]);
return f[x];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
for(int i=1;i<=10000;i++){
f[i] = i;
}
int n;
cin>>n;
while(n--){ //每个集合中只有祖节点没有被确认!!!
//每次循环只确定一个值
int x,y;
cin>>x>>y;
int fx = find(x),fy = find(y);
if(fx>fy) swap(fx,fy);
if(fx==fy) visit[fx] = 1;
else{
f[fx] = fy; //将两个集合合并,x所在集合变为fy的分支
if(!visit[fx]) visit[fx] = 1; //此时只有祖节点fx和fy没被确定,如果fx没被定,
else visit[fy] = 1; //则优先确定较小值fx,否则 确定唯一没被确定的祖节点fy
}
}
int cnt = 0;
for(int i=1;i<=10000;i++){ //循环遍历所有值,如果出现中断则终止
if(visit[i]) cnt++;
else break;
}
cout<<cnt;
return 0;
}