https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/
思路:因为图一共有
n
n
n个点,那么仅需要
n
−
1
n-1
n−1条边就可以使得这个图连通。由于我们可以任意的拆边并将其加到合适的顶点之间,因此如果给定的边数
<
n
−
1
<n-1
<n−1那么一定无解,否则一定有解,有解时所需要的最少操作数就等于图的连通分量个数
−
1
-1
−1。怎么求连通分量个数?
d
f
s
、
b
f
s
、
dfs、bfs、
dfs、bfs、并查集。
class Solution {
public:
vector<int> f;
int father(int x)
{
return f[x]==x?x:f[x]=father(f[x]);
}
int makeConnected(int n, vector<vector<int>>& connections) {
if(connections.size()<n-1)
return -1;
f.resize(n);
for(int i=0;i<n;i++)
f[i]=i;
int ans=n;
for(vector<int>& each:connections)
{
int fx=father(each[0]);
int fy=father(each[1]);
if(fx!=fy)
f[fx]=fy,--ans;
}
return ans-1;
}
};