ホームページ > バックエンド開発 > C#.Net チュートリアル > C# でトポロジーソートアルゴリズムを実装する方法

C# でトポロジーソートアルゴリズムを実装する方法

王林
リリース: 2023-09-21 08:09:02
オリジナル
1281 人が閲覧しました

C# でトポロジーソートアルゴリズムを実装する方法

C# でトポロジカル ソート アルゴリズムを実装するには、特定のコード サンプルが必要です。

トポロジカル ソートは、有向グラフ内のノードの問題を解決するために使用される一般的なグラフ アルゴリズムです。間。ソフトウェア開発では、タスクのスケジューリングやコンパイル順序などの問題を解決するために、トポロジカル ソートがよく使用されます。この記事では、C# でトポロジカル ソート アルゴリズムを実装する方法を紹介し、具体的なコード例を示します。

  1. アルゴリズム原理

トポロジカル並べ替えアルゴリズムは、有向グラフの隣接リストを確立し、深さ優先検索 (DFS) または幅優先を使用することによって表されます。検索 (BFS) を使用して、グラフ内のノードを走査し、特定の順序で出力します。

具体的な手順は次のとおりです。

1) 有向グラフの隣接リストを構築します。有向グラフ内の各ノードを構造として表し、ノードの依存関係を To として表します。サイド。

2) 各ノードの入次数をカウントします。隣接関係テーブルを調べて、各ノードの入次数をカウントします。

3) キューを作成します。入次数が 0 のノードをキューに入れます。

4) 入次数 0 のノードに従ってトラバースを開始します。キューから入次数 0 のノードを取り出し、このノードをソート結果に追加し、隣接するすべての次数のノードの入次数を加算します。このノードのノード数を 1 減らします。

5) キューが空になるまで上記の手順を繰り返します。

  1. コードの実装

次は、C# を使用してトポロジカル ソート アルゴリズムを実装するためのサンプル コードです。#:

using System;
using System.Collections.Generic;

public class Graph
{
    private int V; //图中节点的个数
    private List<int>[] adj; //图的邻接表

    public Graph(int v)
    {
        V = v;
        adj = new List<int>[v];
        for (int i = 0; i < v; ++i)
            adj[i] = new List<int>();
    }

    public void AddEdge(int v, int w)
    {
        adj[v].Add(w); //将节点w加入节点v的邻接表中
    }

    public void TopologicalSort()
    {
        int[] indegree = new int[V]; //用于统计每个节点的入度
        for (int i = 0; i < V; ++i)
            indegree[i] = 0;

        //统计每个节点的入度
        for (int v = 0; v < V; ++v)
        {
            List<int> adjList = adj[v];
            foreach (int w in adjList)
                indegree[w]++;
        }

        Queue<int> queue = new Queue<int>(); //存放入度为0的节点
        for (int i = 0; i < V; ++i)
        {
            if (indegree[i] == 0)
                queue.Enqueue(i);
        }

        List<int> result = new List<int>(); //存放排序结果
        int count = 0; //已经排序的节点个数

        while (queue.Count > 0)
        {
            int v = queue.Dequeue();
            result.Add(v);
            count++;

            //将与节点v相邻的节点的入度减1
            List<int> adjList = adj[v];
            foreach (int w in adjList)
            {
                indegree[w]--;
                if (indegree[w] == 0)
                    queue.Enqueue(w);
            }
        }

        //判断是否有环
        if (count != V)
        {
            Console.WriteLine("图中存在环!");
            return;
        }

        //输出排序结果
        Console.WriteLine("拓扑排序结果:");
        foreach (int v in result)
        {
            Console.Write(v + " ");
        }
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Graph g = new Graph(6);
        g.AddEdge(5, 2);
        g.AddEdge(5, 0);
        g.AddEdge(4, 0);
        g.AddEdge(4, 1);
        g.AddEdge(2, 3);
        g.AddEdge(3, 1);

        g.TopologicalSort();
    }
}
ログイン後にコピー

上記のコードを実行すると、次の結果が得られます。

拓扑排序结果:
5 4 2 3 1 0
ログイン後にコピー

上記は、C# で実装されたトポロジカル ソート アルゴリズムの具体的なコード例です。有向グラフのトポロジカルなソートは、グラフの隣接リストを構築し、次数を数え、走査にキューを使用することによって実現できます。

以上がC# でトポロジーソートアルゴリズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート