Tarjan アルゴリズムを Python で記述するにはどうすればよいですか?

WBOY
リリース: 2023-09-19 09:36:14
オリジナル
1357 人が閲覧しました

Tarjan アルゴリズムを Python で記述するにはどうすればよいですか?

Tarjan アルゴリズムを Python で記述するにはどうすればよいですか?

Tarjan アルゴリズムは、深さ優先探索 (DFS) に基づくグラフ アルゴリズムであり、強接続コンポーネント (SCC) 問題を解決するために使用されます。この記事では、Python で Tarjan アルゴリズムを記述する方法を、具体的なコード例とともに紹介します。

Tarjan のアルゴリズムの基本的な考え方は、各ノードのトラバーサル シーケンス番号と到達可能な最小シーケンス番号を記録しながら、DFS を介してグラフ内のノードをトラバースすることです。トラバーサル中に、現在のノードが到達可能なシーケンス番号の小さいノードがあった場合、それを一時スタックに追加し、トラバーサル終了後にスタックの最上位ノードがルートノードであるかどうかを判断します強く結合したコンポーネントのこと。その場合は、スタックからノードをポップし、結果リストに追加します。

以下は、Python を使用して Tarjan アルゴリズムを記述するコード例です。

def tarjan(graph):
    n = len(graph)
    index = [0] * n
    low_link = [0] * n
    on_stack = [False] * n
    stack = []
    result = []
    index_counter = 0

    def dfs(v):
        nonlocal index_counter
        index[v] = index_counter
        low_link[v] = index_counter
        index_counter += 1
        stack.append(v)
        on_stack[v] = True

        for w in graph[v]:
            if index[w] == -1:
                dfs(w)
                low_link[v] = min(low_link[v], low_link[w])
            elif on_stack[w]:
                low_link[v] = min(low_link[v], index[w])

        if low_link[v] == index[v]:
            scc = []
            while True:
                w = stack.pop()
                on_stack[w] = False
                scc.append(w)
                if w == v:
                    break
            result.append(scc)

    for v in range(n):
        if index[v] == -1:
            dfs(v)

    return result
ログイン後にコピー

上記のコードでは、2 次元リスト graph を使用して、グラフの隣接関係。 graph[i] は、頂点 i が到達できる頂点のセットを表します。アルゴリズムは各頂点を反復的に走査し、頂点がまだ訪問されていない場合は、DFS 関数が呼び出されて検索されます。 DFS 関数は、再帰的手法を使用して Tarjan アルゴリズムのコア ロジックを実装します。

Tarjan アルゴリズムを使用する場合は、グラフの隣接関係を 2 次元リスト graph に変換し、tarjan(graph) を呼び出して、の強結合成分リスト。

概要:

この記事では、Python で Tarjan アルゴリズムを作成する方法を紹介し、具体的なコード例を添付します。 Tarjan アルゴリズムの基本的な考え方を理解することで、このアルゴリズムをより適切に適用して、強く接続されたコンポーネントの問題を解決できるようになります。この記事が読者の Tarjan アルゴリズムの理解と使用に役立つことを願っています。

以上がTarjan アルゴリズムを Python で記述するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!