class unionfind{
public:
vector<int>father;
unionfind(const int &num){//num表示元素的个数
for(int i = 0; i < num; i++){
father.push_back(i);//箭头指向自己
}
}
int find(const int &n){
//递归
if(father[n] == n)
return n;
father[n] = find(father[n]);//路径压缩版本
return father[n];
}
bool myunion(const int &a,const int &b){
if(father[a]==b||father[b]==a)return true;//判断是否是一个集合元素
int fa = find(a);
int fb = find(b);
bool res=fa==fb;
father[fb] = fa;
return res;
}
};
class Solution {
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
int n=edges.size();
vector<int>ans(2,0);
unionfind F(n+1);
for(int i=0;i<n;i++)
{
int a=edges[i][0];
int b=edges[i][1];
bool isok=F.myunion(a,b);
if(isok)//如果是一个集合的元素就更新答案,因为题目要求是最后一个;
{
ans[0]=a;
ans[1]=b;
}
}
return ans;
}
};
leetcode 684. 冗余连接(并查集)
最新推荐文章于 2022-05-14 18:54:28 发布