题目链接:https://leetcode.cn/problems/redundant-connection/submissions/
题目大意:一个图,节点从1
到n
。这个图是由树添加了多余的一条边得到的。边的数量也是n
。给出所有边,求可以去掉的一条边,使得图变回树。如果有多条都满足,求最后的那条。
思路:树是没有环的。边数也是n
的情况下,去掉多余的一条边后肯定是所有节点串成一串。可以从零开始,一条边一条边往上加,当某一条边无法使得该连通分量的节点增加时,这条边就是多余的。为了使得返回的边是最后那条,我们从前面开始遍历边,这样使得【被用上的边都是尽量靠前的,多余的边尽量靠后】
连通分量用并查集记录即可。
完整代码
class Solution {
public:
int fa[1001];
int findRoot(int x) {
if (fa[x] != 0)
return findRoot(fa[x]);
else
return x;
}
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
memset(fa, 0, sizeof(fa));
int N = edges.size();
vector<int> ret(2, 0);
for (int i = 0; i < N; i++) {
int node1 = edges[i][0], node2 = edges[i][1];
int root1 = findRoot(node1), root2 = findRoot(node2);
if (root1 != root2)
fa[node2] = fa[root2] = root1;
else {
ret[0] = node1, ret[1] = node2;
break;
}
}
return ret;
}
};