public class Solution {
public int[] findRedundantDirectedConnection(int[][] edges) {
// 边的条数(在这个问题里等于结点个数)
int len = edges.length;
// 步骤 1:预处理入度数组(记录指向某个结点的边的条数)
int[] inDegree = new int[len + 1];
for (int[] edge : edges) {
inDegree[edge[1]]++;
}
// 步骤 2:先尝试删除构成入度为 2 的边,看看是否形成环
for (int i = len - 1; i >= 0; i--) {
if (inDegree[edges[i][1]] == 2) {
// 如果不构成环,这条边就是要去掉的那条边
if (!judgeCircle(edges, len, i)) {
return edges[i];
}
}
}
// 步骤 3:再尝试删除构成入度为 1 的边,看看是否形成环
for (int i = len - 1; i >= 0; i--) {
if (inDegree[edges[i][1]] == 1) {
// 如果不构成环,这条边就是要去掉的那条边
if (!judgeCircle(edges, len, i)) {
return edges[i];
}
}
}
throw new IllegalArgumentException("输入不符合要求。");
}
/**
* 将 removeEdgeIndex 去掉以后,剩下的有向边是否构成环
*
* @param edges
* @param len 结点总数(从 1 开始,因此初始化的时候 + 1)
* @param removeEdgeIndex 删除的边的下标
* @return 构成环,返回 true
*/
private boolean judgeCircle(int[][] edges, int len, int removeEdgeIndex) {
UnionFind unionFind = new UnionFind(len + 1);
for (int i = 0; i < len; i++) {
if (i == removeEdgeIndex) {
continue;
}
if (!unionFind.union(edges[i][0], edges[i][1])) {
// 合并失败,表示 edges[i][0] 和 edges[i][1] 在一个连通分量里,即构成了环
return true;
}
}
return false;
}
private class UnionFind {
// 代表元法
private int[] parent;
public UnionFind(int n) {
parent = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
}
public int find(int x) {
while (x != parent[x]) {
// 路径压缩(隔代压缩)
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
/**
* @param x
* @param y
* @return 如果合并成功返回 true
*/
public boolean union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) {
return false;
}
parent[rootX] = rootY;
return true;
}
}
}

DdddJMs__135
- 粉丝: 3142
最新资源
- 电气工程中电气自动化融合技术的应用研究.docx
- 山区配电网自动化建设及应用探讨.docx
- 大数据环境下人力资源管理应用.docx
- 大学公共计算机基础课程教学模式探讨.docx
- 计算机软件技术在气象业务中的应用分析.docx
- c语言课程设计-黑白棋对战.doc
- authorware的多媒体课件设计方案——完稿.doc
- 基于蒙特卡罗方法的贝叶斯优化算法.pptx
- 高中数学人教A版(浙江)选修2-2课件:121-2第2课时导数的运算法则.ppt
- WEB的酒店前台管理信息完整.doc
- 基于大数据的智能变电站二次状态监测系统研究.docx
- 商业地产项目管理操盘手册完整稿.doc
- 单片机的LCD液晶显示器控制原理系统设计方案[当文网提供].doc
- XX人寿IT战略规划项目管理实施效果预估.doc
- 东软学院三期网络设计及综合布线方.doc
- 拓宽渠道-因材施教-提高高职院校计算机教学质量.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


