zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 685 冗余连接 II(并查集+有向图)

    685. 冗余连接 II

    在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。

    输入一个有向图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。

    结果图是一个以边组成的二维数组。 每一个边 的元素是一对 [u, v],用以表示有向图中连接顶点 u and v和顶点的边,其中父节点u是子节点v的一个父节点。

    返回一条能删除的边,使得剩下的图是有N个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。

    示例 1:

    输入: [[1,2], [1,3], [2,3]]
    输出: [2,3]
    解释: 给定的有向图如下:
      1
     / 
    v   v
    2-->3
    

    示例 2:

    输入: [[1,2], [2,3], [3,4], [4,1], [1,5]]
    输出: [4,1]
    解释: 给定的有向图如下:
    5 <- 1 -> 2
         ^    |
         |    v
         4 <- 3
    

    注意:

    二维数组大小的在3到1000范围内。
    二维数组中的每个整数在1到N之间,其中 N 是二维数组的大小。

    class Solution {
          public int[] findRedundantDirectedConnection(int[][] edges) {
            int[] path = new int[edges.length+1];
            Arrays.fill(path, -1);
            int path2 = -1;
            for(int i = 0; i < edges.length; i++) {
                if (path[edges[i][1]] != -1) {
                    path2 = i;
                } else {
                    path[edges[i][1]] = i;
                }
            }
            //边中出现了入度为2的点
            if (path2 != -1) {
                int node = edges[path2][1];
                int firstEdge = path[node];
                int temp = firstEdge;
                while (temp != -1) {
                    int index = edges[temp][0];
                    temp = path[index];
                    if (index == node) {
                        //找到第一条边引发的环
                        return edges[firstEdge];
                    }
                }
                return edges[path2];//前一条边无环则直接删除后一条边
            }
            //所有点的入度都为1,必有环,要删除环中最后输入的边
            boolean[] visited = new boolean[edges.length+1];
            Arrays.fill(visited, false);
            int index = 1;
            while (!visited[index]) {
                visited[index] = true;
                int firstEdge = path[index];
                index = edges[firstEdge][0];
            }
            int result = path[index];
            int temp = edges[result][0];
            int edgeNum = 0;
            while (temp != index) {
                edgeNum = path[temp];
                result = Math.max(result, edgeNum);
                temp = edges[edgeNum][0];
            }    
            return edges[result];
        }
    }
    
  • 相关阅读:
    Solution: Win 10 和 Ubuntu 16.04 LTS双系统, Win 10 不能从grub启动
    在Ubuntu上如何往fcitx里添加输入法
    LaTeX 笔记---Q&A
    Hong Kong Regional Online Preliminary 2016 C. Classrooms
    Codeforces 711E ZS and The Birthday Paradox
    poj 2342 anniversary party
    poj 1088 滑雪
    poj 2479 maximum sum
    poj 2481 cows
    poj 2352 stars
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12946285.html
Copyright © 2011-2022 走看看