力扣 684 :冗余连接

题目描述:

  在本问题中, 树指的是一个连通且无环的无向图。

  输入一个图,该图由一个有着 N 个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。

  附加的边的两个顶点包含在 1 到 N 中间,这条附加的边不属于树中已存在的边。

  结果图是一个以边组成的二维数组。每一个边的元素是一对 [u, v] ,满足 u < v,

  表示连接顶点 u 和 v 的无向图的边。返回一条可以删去的边,使得结果图是一个有着 N 个节点

  的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。

示例:

  输入:[[1,2],[1,3],[2,3]]

  输出:[2,3]

  解释:给定的无向图为

    1
   / \
  2 - 3

  输入:[[1,2],[2,3],[3,4],[1,4],[1,5]]

  输出:[1,4]

  解释:给定的无向图为

  5 - 1 - 2
      |   |
      4 - 3

综合解法(javascript实现):

var lines_arr=[[1,2],[2,3],[3,4],[1,4],[1,5]];  //边数组;
function filter_lines(lines){
    let node_counts=lines_arr.length;  //节点数
    let pnodes_arr=new Array(node_counts+1).fill(0).map((val,index)=>index);
    console.log('父:',pnodes_arr);
    console.log(pnodes_arr);
    for(let i=0;i<lines_arr.length;i++){
        let line=lines_arr[i];
        let node1=line[0],node2=line[1];
        if(find(pnodes_arr,node1)!==find(pnodes_arr,node2)){
            union(pnodes_arr,node1,node2);
        }else{
            return line;
        }
    }
    return null;
}
function find(parr,index){
    if(parr[index]!==index){
        parr[index]=find(parr,parr[index]);
    }
    return parr[index];
}
function union(parr,node1,node2){
    parr[node1]=find(parr,node2);
}
console.log('输出多余的边',filter_lines(lines_arr));

 

总结:

  该算法在处理节点是否同集同父问题上简单方便,确实是一个很不错的解题方法;

  其中并查集作为关键只要掌握核心3步就可以方便解题,点击这里 可详细查看该方法。

 

版权声明:本文为博主原创文章,如需转载,请标明出处

posted @ 2021-04-09 00:17  gamecc666  阅读(66)  评论(0编辑  收藏  举报