C#图表算法之无向图

C#图表算法之无向图

什么是无向图

无向图是图的一种,其中边没有方向。也就是说,图中的节点之间的关系是没有顺序的,就像两个人之间的友谊关系不分先后。

在 C# 中,我们可以使用 Dictionary<T1, List<T2>> 来表示一个无向图。其中 T1 表示节点,T2 表示节点和它相邻的节点组成的列表。

构建无向图

下面是一个构建无向图的代码示例。

public Dictionary<int, List<int>> BuildGraph(int[][] edges)
{
    var graph = new Dictionary<int, List<int>>();
    foreach (var edge in edges)
    {
        var v1 = edge[0];
        var v2 = edge[1];
        if (!graph.ContainsKey(v1)) graph[v1] = new List<int>();
        if (!graph.ContainsKey(v2)) graph[v2] = new List<int>();
        graph[v1].Add(v2);
        graph[v2].Add(v1);
    }
    return graph;
}

这个方法接收一个 int[][] 数组作为参数,并返回一个 Dictionary<int, List<int>> 类型的无向图。数组中的每个元素表示节点之间的关系。

例如,[[0,1],[1,2],[2,0]] 表示 0 和 1 相连,1 和 2 相连,2 和 0 相连。使用 BuildGraph 方法传入这个数组可以得到如下结果:

{
    0: [1, 2],
    1: [0, 2],
    2: [1, 0]
}

遍历无向图

有两种方式可以遍历无向图:深度优先搜索(DFS)和广度优先搜索(BFS)。

DFS

深度优先搜索是一种递归算法,它从起始节点开始,在遍历到一个新节点时递归调用自己,直到达到某个结束条件。在遍历过程中,每个节点都会被标记为已访问。

下面是一个使用 DFS 遍历无向图的示例。

public void DFS(Dictionary<int, List<int>> graph, int vertex, HashSet<int> visited)
{
    visited.Add(vertex);
    Console.WriteLine(vertex);
    foreach (var neighbor in graph[vertex])
    {
        if (!visited.Contains(neighbor))
        {
            DFS(graph, neighbor, visited);   
        }
    }
}

这个方法接收一个无向图、起始节点和一个已访问节点列表作为参数。方法中会先标记起始节点为已访问,然后输出当前节点。接着遍历起始节点的所有相邻节点,如果某个相邻节点尚未被访问过,则递归调用 DFS 方法。

例如,假设现在有如下无向图:

{
    0: [1, 2],
    1: [0, 2],
    2: [1, 0]
}

如果我们从节点 0 开始执行 DFS,则程序的输出为:

0
1
2

BFS

广度优先搜索是一种迭代算法,它从起始节点开始,先遍历起始节点的所有相邻节点,然后逐层遍历每个相邻节点的相邻节点。

下面是一个使用 BFS 遍历无向图的示例。

public void BFS(Dictionary<int, List<int>> graph, int start)
{
    var queue = new Queue<int>();
    var visited = new HashSet<int>();

    queue.Enqueue(start);
    visited.Add(start);

    while (queue.Count > 0)
    {
        var vertex = queue.Dequeue();
        Console.WriteLine(vertex);

        foreach (var neighbor in graph[vertex])
        {
            if (!visited.Contains(neighbor))
            {
                queue.Enqueue(neighbor);
                visited.Add(neighbor);
            }
        }
    }
}

这个方法接收一个无向图和起始节点作为参数。方法中会创建一个队列和一个已访问节点列表。起始节点会被加入队列和已访问节点列表。然后程序进入一个循环,每次从队列中取出一个节点并输出。接着遍历当前节点的所有相邻节点,如果某个相邻节点尚未被访问过,则将其加入队列和已访问节点列表。

例如,假设现在有如下无向图:

{
    0: [1, 2],
    1: [0, 2],
    2: [1, 0]
}

如果我们从节点 0 开始执行 BFS,则程序的输出为:

0
1
2

示例说明

示例一

假设现在有如下无向图:

{
    0: [1, 2],
    1: [0, 2],
    2: [1, 0]
}

如果我们使用 DFS 从节点 1 开始遍历,程序的输出为:

1
0
2

如果我们使用 BFS 从节点 1 开始遍历,程序的输出为:

1
0
2

示例二

假设现在有如下无向图:

{
    0: [1, 2],
    1: [0, 2, 3],
    2: [0, 1],
    3: [1, 4],
    4: [3]
}

如果我们使用 DFS 从节点 0 开始遍历,程序的输出为:

0
1
2
3
4

如果我们使用 BFS 从节点 0 开始遍历,程序的输出为:

0
1
2
3
4

总结

本文介绍了如何使用 C# 构建无向图,并通过深度优先搜索和广度优先搜索遍历了无向图。无向图是图的一种,其中边没有方向,节点之间的关系没有先后顺序。在 C# 中,我们可以使用 Dictionary<T1, List<T2>> 来表示一个无向图。使用 DFS 和 BFS 可以遍历无向图。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#图表算法之无向图 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • 实现ASP.NET无刷新下载并提示下载完成的开发思路

    实现ASP.NET无刷新下载并提示下载完成需要以下步骤: 在后端代码中,设置相应的请求响应头,使得浏览器能够正确识别并下载文件。同时需要根据用户的请求生成相应的文件流,以供下载。 示例代码: // 根据请求获取文件名 string fileName = Request["file"]; // 读取文件流 FileStream fileSt…

    C# 2023年5月31日
    00
  • asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1)

    asp.net core MVC 全局过滤器之ExceptionFilter过滤器(1) 在ASP.NET Core MVC中,我们可以使用全局过滤器来处理应用程序中的异常。其中,ExceptionFilter过滤器是一种常用的全局过滤器,用于处理应用程序中的异常。在本文中,我们将详细讲解ExceptionFilter过滤器的使用方法。 ExceptionF…

    C# 2023年5月16日
    00
  • ASP.NET Core获取正确查询字符串参数示例

    标题:ASP.NET Core获取正确查询字符串参数示例 前言: 在Web应用程序中,查询字符串是一种常用的传递参数的方式。然而在ASP.NET Core中,获取查询字符串时需要特别注意一些情况,否则就可能出现获取不到参数值或者获取到错误参数值的问题。本文将详细讲解ASP.NET Core获取正确查询字符串参数的示例。 一、在Controller中获取查询字…

    C# 2023年6月3日
    00
  • js实现C#的StringBuilder效果完整实例

    下面就是详细讲解“js实现C#的StringBuilder效果完整实例”的攻略: 1. 概述 String 类是 JavaScript 中非常重要的内置类,我们在编程中常常需要处理大量字符串的拼接,常见的做法是使用 + 运算符或者字符串模板等。但是这种方法在处理大量字符串时会极大降低性能,并且难以维护。 这时,我们可以使用类似于 C# 中的 StringBu…

    C# 2023年6月7日
    00
  • newtonsoft.json解析天气数据出错解决方法

    下面是详细讲解“newtonsoft.json解析天气数据出错解决方法”的完整攻略: 问题描述 在使用newtonsoft.json库解析天气数据时出现了解析出错的情况。 常见错误信息 常见的错误信息包括但不限于以下内容:- JsonReaderException: Could not convert string to double: XXX- JsonR…

    C# 2023年5月14日
    00
  • C#如何利用反射将枚举绑定到下拉框详解

    下面我将详细讲解如何利用反射将C#中的枚举绑定到下拉框中。 什么是反射? C#中的反射是指通过程序运行时访问、检测和修改程序中的成员的一种机制,它能够让我们在运行时获取类的类型信息、访问属性和方法,并动态创建对象等。 怎样利用反射将枚举绑定到下拉框中? 我们可以通过反射获取到枚举类型的所有值,并将它们绑定到下拉框中。 以下是基本的实现代码: // 获取枚举类…

    C# 2023年6月6日
    00
  • C#从命令行读取参数的方法

    下面是详细的 C# 从命令行读取参数的方法: 安装CommandLineParser库 使用 C# 从命令行读取参数需要用到第三方的库,可以使用 CommandLineParser 库。要使用该库,可以在 Visual Studio 中使用 NuGet 包管理器进行安装,或者使用命令行进行安装。在 Visual Studio 中,可以按照以下步骤进行安装: …

    C# 2023年6月7日
    00
  • C#中参数的传递方式详解

    下面是关于“C#中参数的传递方式详解”的完整攻略。 什么是参数传递? 方法是 C# 中的重要概念,而在方法中,参数的传递是很常见的操作。参数传递的方式可以决定方法对参数的作用,所以我们需要学习并理解这些方式。 C# 中的参数传递方式 C# 中参数传递的方式包括以下几种: 值类型参数传递 引用类型参数传递 输出参数传递 我们接下来逐一介绍这些方式。 值类型参数…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部