并查集理论基础:
简单来说就是看一些点是否在同一个集合里。主要用来解决连通性问题。他有两个功能,一个是判断两个元素是否属于同一集合,另一个是将两个元素加入集合。重点在寻根过程,默认一个元素她的根是她自己,如果是的话,就返回她本身,如果不是的话就去找她的根的根。此外还有判断功能和合并功能。
第一次做还是有点不熟练,一遍看定义一边写,本身并不难。
107.寻找存在的路径
代码:
//因为是否在一组 只需要判断father相不相同就可以 所以有向图无向图都可以用
#include<iostream>
using namespace std;
#include<vector>
vector<int> father;
//找到这个点的根 寻根过程
int find(int s){
if(father[s]==s) return s;//如果根就是自己 直接返回
else return find(father[s]);//如果不是 就层层寻找他的根的根
}
//将s,t这条边加入并查集
void join(int s, int t){
s=find(s);
t=find(t);//找到这个点的根
if(s==t) return;
father[t]=s;
}
bool issame(int s, int t){
s=find(s);
t=find(t);
return s==t;
}
int main(){
int m,n,s,t;
cin>>n>>m;
//存储点n的根是哪个点
for(int i=0;i<=n;i++){
father.push_back(i);
}
for(int i=0;i<m;i++){
cin>>s>>t;
join(s,t);
}
cin>>m>>n;
if(issame(m,n))cout<<1;
else cout<<0;
return 0;
}