友人の[LeetCode] 547円(DFS)

タイトル

クラス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);
            }
        }
    }
}

おすすめ

転載: www.cnblogs.com/coding-gaga/p/12306009.html