首页 > 编程语言 >c#实现图的拓扑排序

c#实现图的拓扑排序

时间:2024-03-20 22:14:25浏览次数:34  
标签:c# graph 拓扑 int visited 排序 AddEdge

原文链接:https://blog.csdn.net/MfuuJava/article/details/132933517

拓扑排序是一种在有向无环图(DAG)中对节点进行排序的算法。

在 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();
        Console.ReadKey();
    }
}

 

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

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

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

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

标签:c#,graph,拓扑,int,visited,排序,AddEdge
From: https://www.cnblogs.com/Dongmy/p/18086203

相关文章

  • C++ <atomic>汇编语言实现原理
    C++<atomic>汇编语言实现原理问题我们先看一下这段代码:/**badcnt.c-Animproperlysynchronizedcounterprogram*//*$beginbadcnt*//*WARNING:Thiscodeisbuggy!*/#include"csapp.h"void*thread(void*vargp);/*Threadroutineprototype*//*......
  • 2024-03-19 leetcode写题记录
    目录2024-03-19leetcode写题记录85.最大矩形题目链接题意解法2024-03-19leetcode写题记录85.最大矩形题目链接85.最大矩形题意给定一个仅包含0和1、大小为rowsxcols的二维二进制矩阵,找出只包含1的最大矩形,并返回其面积。解法先对每个元素求出其往上能延伸......
  • Salesforce LWC学习(四十九) RefreshView API实现标准页面更新,自定义组件自动捕捉更新
    本篇参考: https://developer.salesforce.com/docs/platform/lwc/guide/data-refreshview.htmlhttps://developer.salesforce.com/docs/platform/lwc/guide/reference-lightning-refreshview.htmlhttps://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KX6dA......
  • gRPC简单示例
    gRPC概述gRPC是一种跨语言的RPC框架,之所以它能跨语言,是因为它基于protobuf描述对象实体和方法,最后通过protobuf编译器生成指定语言的代码。这样,就能通过一套protobuf声明生成多种语言的相同API,对于实现跨语言的RPC通信非常便利,同时也使用protobuf作为通信的序列化协议。如下通......
  • find symbolic links
    -P永远不要跟随符号链接。这是默认行为。当find检查或打印有关文件的信息时,如果该文件是符号链接,则所使用的信息应从符号链接本身的属性中获取。 -L遵循符号链接。当find检查或打印有关文件的信息时,所使用的信息应取自链接指向的文件的属性,而不是链接本身(除非它是一个断开的......
  • spring refresh的流程(AbstractApplicationContext的refresh方法)
    12个阶段1、prepareRefresh,做准备工作2、obtainFreshBeanFactory,创建或获取beanfactory3、prepareBeanFactory,准备beanfactory4、postProcessBeanFactory,子类扩展beanfactory5、invokeBeanFactoryPostProcessors,后处理器扩展beanfactory6、registerBeanPostProcessors,准备b......
  • CGroup和namespace的介绍以及区别
    namespace:namespace是Linux内核用来隔离内核资源的方式。通过namespace可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程感受不到对方的存在。具体方式就是把一个或者多个进程的相关资源指定在同一个namespace中。Linuxnam......
  • lc3072 将元素分配到两个数组中2
    给定数组nums[n],定义f(arr,val)表示数组arr中大于val的元素个数,需要操作n次将nums分配到两个数组里,具体如下:第1次操作将nums[1]追加到arr1,第2次操作将nums[2]追加到arr2后续第i次操作:如果f(arr1,nums[i])>f(arr2,nums[i]),则将nums[i]追加到arr1。如果f(arr1,nums[i])<f(a......
  • VScode 配置私钥免密登录
    VScode配置私钥免密登录配置公钥私钥进行免密登录在前文已经提及。在完成上述配置后,我们希望在VScode中配置,毕竟主要的开发环境还是在VScode上且连接到远程服务器会经常遇到网络不稳定需要重新输入密码登录的情况,所以更加凸显了配置私钥的必要性。前提条件本地主机中已有配置......
  • ASP.NET通过Appliaction和Session统计在人数和历史访问量
    目录背景:Appliaction:Session:过程:数据库:Application_Start:Session_Start:Session_End:Application_End:背景:事件何时激发Application_Start在调用当前应用程序目录(或子目录)的第一个ASP.NET页面时激发Applicaiotn_End在应用程序最后一次会话结束时激发,此外在使用I......