知识点
并查集
结果
实现
码前思考
- 在草稿纸上模拟加边的过程,发现当对同一棵树上的两个节点加边时,这条边就是答案要求的冗余边。因此,应该要解题的核心就是判断两个顶点是否在一棵树中,很容易想到并查集。
代码
//无向图
//编号从1开始!
//结点的个数最多是1000
//其实可以看作是树的合并,最开始每个节点相当于是一棵树
//因此可以使用并查集?
class Solution {
private:
//最大的结点数
const static int maxv = 1010;
//父亲数组
int father[maxv];
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
//初始化父亲数组
for(int i=0;i<maxv;i++){
father[i] = i;
}
//边的两个端点
int u;
int v;
//开始读入我们的边
for(auto edge : edges){
u = edge[0];
v = edge[1];
int faU = findFather(u);
int faV = findFather(v);
if(faU == faV){ //如果两者父亲相等,说明两者在同一棵树中
break;
}else{
father[faU] = faV;
}
}
vector<int> ans;
ans.push_back(u);
ans.push_back(v);
return ans;
}
int findFather(int x){
if(x == father[x]){
return x;
}
int tmp = findFather(father[x]);
father[x] = tmp;
return tmp;
}
};
码后反思
- 一棵树有 个节点,那么它只能有 条边;
- 这道题继续加深了我对并查集的理解。