Comment implémenter un algorithme de tri topologique en C#

王林
Libérer: 2023-09-21 08:09:02
original
1160 Les gens l'ont consulté

Comment implémenter un algorithme de tri topologique en C#

Comment implémenter l'algorithme de tri topologique en C#, des exemples de code spécifiques sont nécessaires

Le tri topologique est un algorithme de graphe courant utilisé pour résoudre les dépendances entre les nœuds dans les graphes orientés. Dans le développement de logiciels, le tri topologique est souvent utilisé pour résoudre des problèmes tels que la planification des tâches et l'ordre de compilation. Cet article explique comment implémenter l'algorithme de tri topologique en C# et fournit des exemples de code spécifiques.

  1. Principe de l'algorithme

L'algorithme de tri topologique est représenté en établissant une liste de contiguïté d'un graphe orienté, puis utilise la recherche en profondeur d'abord (DFS) ou la recherche en largeur d'abord (BFS) pour parcourir les nœuds du graphe et sortez-le dans un certain ordre.

Les étapes spécifiques sont les suivantes :

1) Construire la liste d'adjacence du graphe orienté : représenter chaque nœud du graphe orienté comme une structure, et représenter les dépendances des nœuds comme des arêtes orientées.

2) Comptez le degré en entrée de chaque nœud : parcourez la liste de contiguïté et comptez le degré en entrée de chaque nœud.

3) Créez une file d'attente : placez les nœuds avec un degré d'entrée de 0 dans la file d'attente.

4) Commencez le parcours en fonction du nœud de degré 0 : retirez un nœud de degré 0 de la file d'attente, ajoutez ce nœud au résultat du tri et réduisez le degré de tous les nœuds adjacents de ce nœud. par 1.

5) Répétez les étapes ci-dessus jusqu'à ce que la file d'attente soit vide.

  1. Implémentation du code

Ce qui suit est un exemple de code pour implémenter l'algorithme de tri topologique en utilisant C# :

using System; using System.Collections.Generic; public class Graph { private int V; //图中节点的个数 private List[] adj; //图的邻接表 public Graph(int v) { V = v; adj = new List[v]; for (int i = 0; i < v; ++i) adj[i] = new List(); } 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 adjList = adj[v]; foreach (int w in adjList) indegree[w]++; } Queue queue = new Queue(); //存放入度为0的节点 for (int i = 0; i < V; ++i) { if (indegree[i] == 0) queue.Enqueue(i); } List result = new List(); //存放排序结果 int count = 0; //已经排序的节点个数 while (queue.Count > 0) { int v = queue.Dequeue(); result.Add(v); count++; //将与节点v相邻的节点的入度减1 List 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(); } }
Copier après la connexion

L'exécution du code ci-dessus produira les résultats suivants :

拓扑排序结果: 5 4 2 3 1 0
Copier après la connexion

Ce qui précède est un exemple de code spécifique pour le tri topologique algorithme implémenté en C#. Le tri topologique des graphiques orientés peut être réalisé en créant des listes de graphiques adjacents, en comptant en degrés et en utilisant des files d'attente pour le parcours.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!