文章目录
685.冗余调度II
是一道图论的题目,冗余连接存在两种,一种是没有入读为2的情况,但是最终成环,一种是某个节点的入读为2;
- 第一种情况:我们只需要利用并查集检查连通性,如果检查到连接的两个点其实已经连通,就记录,记为
cycle
。到最后没有出现入读为2的边的话,就删除。否则看情况2. - 第二种情况:首先我们记录下添加边以后某点入读为2的该条边是什么,记为
conflit
,对应的另外一个记为edge[node]
,此时先不连接conflit
这条边。然后分两个情况,如果最终没成环,我们直接删除这条边conflit
。如果存在入度为2的边,且成环了,删去前一条边edge[node]
。
class Solution {
public int[] findRedundantDirectedConnection(int[][] edges) {
int nodesCount = edges.length;
UnionFind uf = new UnionFind(nodesCount + 1);
// 只用来标记直系父节点
int[] parent = new int[nodesCount + 1];
for (int i = 1; i <= nodesCount; ++i) {
parent[i] = i;
}
int conflict = -1;
int cycle = -1;
for (int i = 0; i < nodesCount; ++i) {
int[] edge = edges[i];
int node1 = edge