Number of Operations to Make Network Connected 之 并查集
2021-02-11 16:21
标签:for map 没有 integer nec als style cte ati 本题的关键是要知道图论中的一个原理:无向图中, n个结点 至少需要 n-1条边,才能使各个结点相连。 有两种解法: 1.用递归遍历的方式,计算有多少个独立的连通的部分,我称为“簇”。需要移动的边就是 簇的个数减1。 2.使用并查集,计算有几个联通部分,有几条多余的边。如果多余的边小于联通部分,返回-1。否则返回簇的个数减1。 Number of Operations to Make Network Connected 之 并查集 标签:for map 没有 integer nec als style cte ati 原文地址:https://www.cnblogs.com/yawenw/p/13038574.htmlclass Solution {
Map
class Solution {
public int makeConnected(int n, int[][] connections) {
int[] parent = new int[n];
for(int i = 0; i ){
parent[i] = i;
}
int extraEdge = 0;
int count = 0;
for(int[] edge:connections){
int p = findParent(parent, edge[0]);
int q = findParent(parent, edge[1]);
if(p == q) extraEdge++; //有公共祖先,说明此条边多余,可以去掉
else parent[q] = p; //如果没有,根据connections矩阵,将两个点连接起来
}
for(int i = 0; i ){
if(parent[i] == i) count++; //计算有多少个祖先,即多少个 单独的联通量
}
return (extraEdge >= count-1) ? count-1 : -1;
}
public int findParent(int[] parent, int x){
while(parent[x] != x){
x = parent[x];
}
return x;
}
}
上一篇:css之简易水波效果
下一篇:inject某网站延时注入代码
文章标题:Number of Operations to Make Network Connected 之 并查集
文章链接:http://soscw.com/index.php/essay/54087.html