第一题
链接:https://www.nowcoder.com/questionTerminal/7c29cdfa28274c86afc9e88c07448a10
来源:牛客网
链接:https://www.nowcoder.com/questionTerminal/7c29cdfa28274c86afc9e88c07448a10
来源:牛客网
来源:牛客网
猫猫有脾气
顶点数目必须足够大 啊啊啊!!!
来源:牛客网
#include<cstdio>
using namespace std;
const int MAX=1000010;
int father[MAX];
int height[MAX];
bool visit[MAX];
void Init(){
for(int i=1;i<MAX;i++){
father[i]=i;
height[i]=0;
visit[MAX]=false;
}
}
int Find(int x){
if(x!=father[x]){
father[x]=Find(father[x]);
}
return father[x];
}
void Union(int x,int y){
x=Find(x);
y=Find(y);
if(x!=y){
if(height[x]<height[y]){
father[x]=y;
}else if(height[x]>height[y]){
father[y]=x;
}else{
father[y]=x;
height[x]++;
}
}
}
int main(){
Init();
int MaxNum=0;
int x,y;
while(scanf("%d%d",&x,&y)!=EOF){
Union(x,y);
visit[x]=true;
visit[y]=true;
MaxNum=MaxNum>x?MaxNum:x;//为了缩小下面的遍历范围 保留这一个文件中最大编号的节点
MaxNum=MaxNum>y?MaxNum:y;
}
int component=0;
for(int i=1;i<=MaxNum;i++){
if(!visit[i])
continue;
if(father[i]==i)
component++;
}
printf("%d\n",component);
return 0;
}