タイトル
クラスN.の学生があります。それらのいくつかが友達である、いくつかはそうではありません。彼らの友情は推移でいます。あなたはAの友人Bを知っている場合は、B、Cは友人であるので、我々は、AはCの友人であると仮定することができます。友人のいわゆる円は、すべてのあなたの友人のセットです。
N * N行列Mを考えると、クラスの高校生との友情を表しています。もしM [i]の[J] = 1、そうでない場合は私は知らない、知られているi番目とj番目の生徒相互の友情を表しています。あなたは友人の既知の円の合計数は、すべての学生にエクスポートする必要があります。
例1:
入力します
:[[1,1,0]、
[1,1,0]、
[0,0,1]]
出力:2
説明:既知の学生と学生0 1共通の友人が、彼らは友人のサークルです。
友人のサークルの最初の2人の学生自身。2が返されます。
例2:
入力
:[[1,1,0]、
[1,1,1]、
[0,1,1]]
出力:1つの
説明:知ら学生学生0と1の共通の友人、学生と学生2相互友人、学生と学生0 2も友人、友人、リターン1の円の中にそれらのように3になるように。
注意:
【1200】範囲内でN。
すべての学生、M [i]の[i]を=のために 1。
もしM [I] [J] = 1、 次にM [j]は[I] =ある 1。
出典:滞在ボタン(LeetCode)
:リンクhttps://leetcode-cn.com/problems/friend-circles
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
問題の解決策
無向グラフ所与の隣接行列、無向グラフ要件を通信ブランチの数。
ここでDFSの使用は、特に、一次元マトリクスの使用は、アクセスポイントを表しているかどうか。
コード
class Solution {
public int findCircleNum(int[][] M) {
boolean[] visited=new boolean[M.length];
int cnt=0;
for(int i=0;i<visited.length;++i){
if(!visited[i]){
dfs(M,visited,i);
cnt++;
}
}
return cnt;
}
private void dfs(int[][] M,boolean[] visited,int i){
visited[i]=true;
for(int j=0;j<M.length;++j){
if(!visited[j]&&M[i][j]==1){
dfs(M,visited,j);
}
}
}
}