题目直通车:P1536 村村通
进入正题
看到这题很容易想到的一种方法就是并查集
今天刚好学了并查集,就拿这题来练练手
我的思路是先将提供的路径合并,然后未联通的路径连接起来,答案+1
话不多说,上代码 (解释都在代码里了)
#include<bits/stdc++.h>
using namespace std;
int f[1000001],ans=0;
int find(int k){ //find函数 (寻找 "父亲")
if(f[k]==k) return k;
else return f[k]=find(f[k]);
}
void pin(int x,int y){ //进行连接的函数 (我为什么要写这个函数???)
f[find(x)]=find(y);
}
int main(){
int a,b;
while(1){
ans=0; //答案de计数器
cin>>a;
if(a==0) return 0; //判断是否退出程序
cin>>b;
for(int i=1;i<=a;i++) f[i]=i; //初始化
for(int i=1;i<=b;i++){
int x,y;
cin>>x>>y;
pin(x,y); //连接提供的路径
}
//开始计算还需要的路径
for(int i=1;i<a;i++){
if(find(f[i])==find(f[i+1])){ //前后乡村联通 (好像要不要这句都无所谓)
continue;
}else{ //如果前后乡村未联通
pin(i,i+1); //进行连接
ans++; //答案+1
}
}
cout<<ans<<"\n"; //输出答案
}
return 0;
}