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日

相关文章

  • C# ThreadPool之QueueUserWorkItem使用案例详解

    C# ThreadPool之QueueUserWorkItem使用案例详解 这篇文章介绍了C#中的线程池,及其使用方式之一:QueueUserWorkItem方法。接下来,我会更详细地讲解这篇文章的重点内容,以及为何可以使用它来实现线程池。 什么是线程池? 在线程池中,管理器维护多个已经创建的线程,使每个线程可以被重复利用,从而达到节省线程创建时间的目的,提…

    C# 2023年6月6日
    00
  • C#制作网站挂机程序的实现示例

    对于C#制作网站挂机程序的攻略,以下是几个关键步骤: 引用必要的库:为了制作一个网站挂机程序,你需要引用一些必要的库。这里我们建议使用HttpClient和HtmlAgilityPack。HttpClient库用于进行HTTP请求,而HtmlAgilityPack库用于解析HTML文件。 using System.Net.Http; using HtmlAg…

    C# 2023年5月15日
    00
  • C#窗体传值实例汇总

    C#窗体传值实例汇总 简介 在C#窗体应用程序中,传递数据是非常常见的需求,本文将对C#窗体传值相关知识进行汇总与讲解,包括如何在不同窗体间传递数据、如何使用委托传递数据、如何使用事件传递数据等。 不同窗体间传递数据 方法一:通过构造函数传值 在窗体A中,对窗口B进行实例化时,通过构造函数传递参数即可。 // 窗体A private void button1…

    C# 2023年6月7日
    00
  • asp.net 仿腾讯微薄提示 还能输入*个字符 的实现代码

    实现仿腾讯微博的提示功能,我们需要使用前端技术(HTML、CSS、JavaScript)和后端技术(ASP.NET)。下面给出完整的攻略: 准备工作 首先,我们需要在ASP.NET中创建一个Web项目,并配置好数据库连接。建议使用Microsoft SQL Server数据库。然后,在项目中添加一个Web页面,用于实现提示功能。 前端实现 我们需要在Web页…

    C# 2023年5月31日
    00
  • C#与java TCP通道加密通信实例

    首先,为了实现C#与Java之间的TCP加密通道通信,我们需要使用SSL加密套接字。下面是实现的步骤: 步骤1:创建SSL加密证书 我们需要在服务器上创建一个SSL证书用于加密TCP通信,这可以使用OpenSSL工具来实现。 openssl req -new -x509 -days 365 -nodes -out server.crt -keyout ser…

    C# 2023年6月7日
    00
  • 浅谈ASP.NETCore统一处理404错误都有哪些方式

    ASP.NET Core统一处理404错误的方式有多种,本文将详细讲解这些方式,包括实现过程、示例说明等。 方式一:使用中间件处理404错误 ASP.NET Core提供了中间件来处理404错误。我们可以在Startup.cs文件中添加以下代码: public void Configure(IApplicationBuilder app, IWebHostE…

    C# 2023年5月16日
    00
  • js中escape对应的C#解码函数 UrlDecode

    下面就为您详细讲解: 将JS中的escape编码转换为C#中的UrlDecode是常见的需求,可以通过以下步骤实现。 首先,在C#里面引用System.Web命名空间: using System.Web; 然后,在代码里面调用UrlDecode方法来解码: string result = HttpUtility.UrlDecode(input); 其中,in…

    C# 2023年6月7日
    00
  • Asp.Net Core使用Ocelot结合Consul实现服务注册和发现

    ASP.NET Core 使用 Ocelot 结合 Consul 实现服务注册和发现 Ocelot 是一个基于 .NET Core 的 API 网关,可以帮助我们实现服务注册和发现、负载均衡、路由转发等功能。本攻略将介绍如何使用 Ocelot 结合 Consul 实现服务注册和发现。 步骤 以下是使用 Ocelot 结合 Consul 实现服务注册和发现的步…

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