题目描述:
在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着 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步就可以方便解题,点击这里 可详细查看该方法。
版权声明:本文为博主原创文章,如需转载,请标明出处