C#: 实现拓扑排序算法

拓扑排序是一种在有向无环图(DAG)中对节点进行排序的算法。在拓扑排序中,图的节点表示任务或依赖关系,边表示任务间的依赖关系。拓扑排序的结果是一个线性排序,该排序满足任何依赖关系:如果任务 A 依赖于任务 B,则任务 B 必须在任务 A 之前执行。

在 C# 中,我们可以使用深度优先搜索(DFS)和拓扑排序算法来解决这个问题。下面是一个示例代码,演示了如何实现拓扑排序算法:

using System;
using System.Collections.Generic;

class Graph
{
    private int V; // 图中节点的数量
    private List<List<int>> adj; // 邻接列表

    // 构造函数
    public Graph(int v)
    {
        V = v;
        adj = new List<List<int>>(v);
        for (int i = 0; i < v; ++i)
            adj.Add(new List<int>());
    }

    // 添加边
    public void AddEdge(int v, int w)
    {
        adj[v].Add(w);
    }

    // 拓扑排序的辅助函数
    private void TopologicalSortUtil(int v, bool[] visited, Stack<int> stack)
    {
        visited[v] = true;

        foreach (int i in adj[v])
        {
            if (!visited[i])
                TopologicalSortUtil(i, visited, stack);
        }

        stack.Push(v);
    }

    // 执行拓扑排序
    public void TopologicalSort()
    {
        Stack<int> stack = new Stack<int>();

        bool[] visited = new bool[V];
        for (int i = 0; i < V; i++)
            visited[i] = false;

        for (int i = 0; i < V; i++)
        {
            if (visited[i] == false)
                TopologicalSortUtil(i, visited, stack);
        }

        // 打印排序结果
        while (stack.Count > 0)
        {
            Console.Write(stack.Pop() + " ");
        }
    }

    // 测试
    public static void Main(string[] args)
    {
        Graph graph = new Graph(6);
        graph.AddEdge(5, 2);
        graph.AddEdge(5, 0);
        graph.AddEdge(4, 0);
        graph.AddEdge(4, 1);
        graph.AddEdge(2, 3);
        graph.AddEdge(3, 1);

        Console.WriteLine("拓扑排序结果:");
        graph.TopologicalSort();
    }
}

在上述代码中,我们首先定义了一个 Graph 类,用于表示有向无环图。Graph 类包含了图中节点的数量和一个邻接列表 adj,用于存储图的边。

我们使用 AddEdge 方法向图中添加边。然后,在 TopologicalSortUtil 方法中,我们使用深度优先搜索来遍历图,并将访问过的节点压入栈中。

最后,在 TopologicalSort 方法中,我们遍历图中的所有节点,并调用 TopologicalSortUtil 方法进行拓扑排序。最终,我们打印栈中的元素,即可得到拓扑排序的结果。

在上述示例中,我们创建了一个包含6个节点的图,并添加了一些边。然后,我们执行拓扑排序,并打印排序结果。

希望上述示例能帮助你理解如何在 C# 中实现拓扑排序算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值