クラスの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:
入力 :[[1,1,0]、 [1,1,1]、 [0,1,1]] 出力:1 説明:0番目と1番目の生徒が直接友達で、第一及び第二の学生が直接の友人です、
その0番目と2番目の学生は間接的な友人です。それらのすべてが同じ友人のサークルにいるので、1を返します。
注意:
- Nは範囲[1200]です。
- Mのすべての学生のための[i]は[I] = 1。
- もしM [I] [J] = 1の場合、M [j]は[I] = 1。
溶液:
クラスのソリューション(オブジェクト): デフfindCircleNum(自己、M): "" " :タイプM:リスト[一覧[INT] :RTYPE:int型 """ #のマップ:キー:#値:グループ#1 #のリスト[I] => i番目の要素のグループ#1 行= LEN(M) GROUPMAP = [I 用 I における範囲(行)] DEF DFS(グループインデックス): GROUPMAP [インデックス] = グループ のために COL、友人に列挙(M [インデックス]): もし!COL =インデックスと友人とGROUPMAP [COL] == COL: DFS(グループ、COL) のための行に範囲(行): もし GROUPMAP [行] =行:続ける DFS(行、列) 戻りLEN(セット(GROUPMAP))を
DFS友人のタイトルで有名なサークル、アイデアはシリアル番号がマップの代わりに一覧表示するには、(図の通信に類似)までのすべての友人、これらの人々と同じグループを見つけ、0から開始し終了するには、対応するグループ番号のi番目の要素を表しそれはセット、友人の長手方向の円の、すなわち数をとります。