多余的边java实现

class Solution {
    public int[] findRedundantConnection(int[][] edges) {
        //首先这是一个关于图的问题,我们可以使用这样一种思路来解题,先将图给分为由n个节点(每个节点看作一个子图)构成的一个图,接着我们遍历每一条边逐个添加一条边,如果添加的一条边将两个子图联合成一个图那么它一定就不会形成有环图,如果一条边添加到了同一个子图中那么这个子图就一定会产生一个环
        //首先遍历所有节点找到所存储的数最大的节点,这样方便构建一个数组用于表示所有节点的根节点
        int max = Integer.MIN_VALUE;
        for(int[] edge : edges){
            for(int num : edge){
                max = Math.max(max,num);
            }
        }
        int[] fathers = new int[max + 1];
        //起始时每一个节点的根节点都是自己
        for(int i = 0;i <= max;i++){
            fathers[i] = i;
        }
        //遍历每一条边如果这条边在不同的两个并查集之内就可以联合两个子图,如果在相同的并查集之内就会形成环这就是我们要寻找的那一条边
        for(int i = 0;i < edges.length;i++){
            if(!union(fathers,edges[i][0],edges[i][1])){
                return edges[i];
            }    
        }
        return null;
    }

    //寻找一个节点的并查集的根节点
    private int findRoot(int[] fathers,int i){
        //如果一个节点的根节点不是自己,查找他父节点的根节点
        if(fathers[i] != i){
            fathers[i] = findRoot(fathers,fathers[i]);
        }
        return fathers[i];
    }

    //判断两个节点是否在一个并查集之内
    private boolean union(int[] fathers,int i,int j){
        //先寻找两个节点各自的根节点
        int rooti = findRoot(fathers,i);
        int rootj = findRoot(fathers,j);
        if(rooti != rootj){
            fathers[rooti] = fathers[rootj];
            return true;
        }
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值