题目:684. 冗余连接
思路
并查集;
从前往后遍历,如果不属于同一个集合(不是同一个爸爸),就加入,否则就返回这条边;
因为不属于同一个集合,加入可以形成树,要不然会成环,而且题目限定整个图是一棵树加一条边,所以多出来的那个删掉之后就刚好形成一棵树(就是这么巧);
代码
// 删除之后,都拥有同一个爸爸
class Solution {
private:
int n = 1005;
int father[1005] = {0};
void init()
{
int i;
for(i = 0; i < n; i++)
{
father[i] = i;
}
}
int find(int u)
{
if(u == father[u])
{
return u;
}
else
{
return father[u] = find(father[u]);
}
}
bool isSame(int u, int v)
{
u = find(u);
v = find(v);
if(u == v)
{
return true;
}
return false;
}
// u -> v
void join(int u, int v)
{
u = find(u);
v = find(v);
if(u == v)
{
return;
}
father[u] = v;
}
public:
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
int i, u, v;
init();
for(i = 0; i < edges.size(); i++)
{
u = edges[i][0];
v = edges[i][1];
if(!isSame(u, v))
{
join(u, v);
}
else
{
return edges[i];
}
}
return {};
}
};