1.幅優先検索(最短経路を検索)
友達の家への最短ルート?チェスで最少のステップ数を獲得しますか?ネットワークで最も近い写真家ですか?
ツインピークスからゴールデンゲートブリッジまでの最後の3つのステップ。
第二に、グラフの概念:ノードとエッジ
3.パスはありますか?どの経路が最短ですか?
ネットワーク:
幅優先探索の実行では、探索範囲は開始点から徐々に外側に広がります。つまり、最初に1次の関係がチェックされ、次に2次の関係がチェックされます。そして順番にキューに追加されます。
つまり、最初のレベルの関係は最初にキューに入れられ、2番目のレベルの関係は後でキューに入れられますが、同じレベルの順序は自由に調整できます。ただし、重複は避けてください。
4、アルゴリズムの実装
1.チェックする人(レベル1)を格納するキューを作成します。
2.キューから人をポップし、条件を満たしているかどうかを確認します。
3.会う、あなたは終わった、そしてやめる;
4.そうでない場合は、この人物のすべての隣人をキューに追加します(第2レベル)。
5.手順2に戻ります。
6.キューが空の場合、ネットワークには資格のある人はいません。
コレクションから1 インポートdeque 2 3グラフ= {} 4グラフ[ " あなた" ] = [ " アリス"、" ボブ"、" クレア" ] 5グラフ[ " アリス" ] = [ " ペギー" ] 6グラフ[ " ボブ" ] = [ " anuj " " ペギー」] 7グラフ[ " クレア" ] = [ " トム"、" ジョニー" ] 8グラフ[ " anuj " ] = [] 9グラフ[ " ペギー" ] = [] 10グラフ[ " トム" ] = [] 11グラフ[ " jonny " ] = [] 12 13 def search(name): 14 search_queue =デック() #キューを作成します。 15 search_queueグラフ+ = [名前] #あなたの隣人の検索・キューに追加 16 = []で検索 #被検査者を記録するための 17。 18で しばらく search_queue: #長い行列が空でない限り 。19 人= search_queue.popleft() #は、最初にしてください人 20 のiF ない人で検索: #チェックするとき、これは検査されていない場合にのみ、 21 のiF:person_is_seller(人物) #1 の要件にチェック準拠 22 印刷(人は、「マンゴー売主があります!」) 23 リターン真の 24 他: 25 search_queue + =グラフ[人] #要件を満たしていない、これらの個々の友人が検索キュー参加する 26 searched.append(人) 27 リターン偽 28 29 DEF person_is_seller(名): 30 リターン名を[ - 。1] == 「M 」 #の条件、それはメートルの名前の最後の文字であれば 31がある 32件の検索(「あなた」)
トムはマンゴーの売り手です! Out [ 5 ]: True
判定されたものは記録し、次回はチェックしないでください。そうしないと、無限ループに陥ります。
幅優先探索の実行時間はO(頂点の数+エッジの数)= O(V + E)
注:
1.検索リストの参加者を参加順にチェックする必要があります。そうでない場合、見つかったものは最短パスではないため、検索リストはキューである必要があります。
2.チェックした人は、もう一度チェックしないでください。チェックしないと、無限ループが発生する可能性があります。