イーサネットケーブルが n
コンピュータネットワークに接続され、コンピュータがから番号が付けられている 0
に n-1
。ケーブル-は connections
その発現 connections[i] = [a, b]
コンピュータに接続されている a
と b
。
ネットワークは、任意のコンピュータは、間接的に他の直接またはコンピュータネットワークを介して同一のネットワークにアクセスすることができます。
あなたの最初の配線コンピュータネットワークを与え connections
、あなたがコンピュータの間で任意の二つのストレートケーブルを抜いて、直接接続されていないコンピュータのペアを接続するためにそれを使用することができます。計算してください、すべてのコンピュータが必要な操作の最小数を通信している返します。これはされていない場合は-1。
例1:
入力:。N- = 4、接続= [0,1]、[0,2]、[1,2] 出力: 1 説明:コンピュータ1と2との間にケーブルを抜いて、コンピュータに差し込みそして上部13。
例2:
入力:。N- = 6、接続= [0,1]、[0,2]、[0,3]、[1,2]、[1,3] 出力: 2
例3:
入力:。N- = 6、接続= [0,1]、[0,2]、[0,3]、[1,2] 出力: -1 説明:ケーブルの数が不足。
例4:
入力:。N- = 5、接続= [0,1]、[0,2]、[3,4]、[2,3] 出力: 0
思考:DFS設定または数及び通信ブロック、ここで互いに素なセットを決定するためにチェックすることができ、必要な動作の数は、接続されたブロックから1を引いた数であります
class Solution {
public:
int father[100001];
int findfather(int x){
int a = x;
while(x!=father[x]){
x = father[x];
}
while(a!=father[a]){
int z = a;
a = father[a];
father[z] = x;
}
return x;
}
int makeConnected(int n, vector<vector<int>>& connections) {
int num = connections.size();
for(int i = 0;i<n;i++){
father[i] = i;
}
int a,b,faA,faB;
for(int i = 0;i<connections.size();i++){
a = connections[i][0];
b = connections[i][1];
faA = findfather(a);
faB = findfather(b);
if(faA!=faB)father[faA] = faB;
}
int isroot[n] = {0},sum = 0;
//查找有多少个连通块
for(int i = 0;i<n;i++){
isroot[findfather(i)]++;
}
for(int i = 0;i<n;i++){
if(isroot[i]!=0)sum++;
}
//如果线缆足够则输出操作次数,否则输出-1
if(num>=n-1)return sum-1;
else return -1;
}
};