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日

相关文章

  • .NET Core系列之MemoryCache 初识

    .NET Core系列之MemoryCache 初识 在本攻略中,我们将详细讲解.NET Core中的MemoryCache,包括其基本概念、使用方法和示例说明。 MemoryCache简介 MemoryCache是.NET Core中的一个内存缓存库,可以用于缓存应用程序中的数据。它提供了一种快速、可靠和高效的方式来缓存数据,以提高应用程序的性能和响应速度…

    C# 2023年5月16日
    00
  • C#编写一个简单记事本功能

    下面是C#编写一个简单记事本功能的完整攻略。 1. 创建窗体和控件 首先创建一个新的Windows Form应用程序。接着,在窗体上拖动一个文本框控件,一个菜单栏控件和一个文件对话框控件。 2. 实现文件打开和保存功能 双击菜单栏的“打开”按钮,在代码中实现打开文件对话框的功能,并将选择的文件内容读取到文本框控件中。示例如下: private void op…

    C# 2023年5月31日
    00
  • C#实现斐波那契数列的几种方法整理

    C#实现斐波那契数列的几种方法整理 什么是斐波那契数列 斐波那契数列是一个非常著名的数列,其前两项是0和1,后续项是前两项之和,即: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … 方法一:递归 递归是一种自上而下的方式解决问题,可以很自然地实现斐波那契数列。 public static int Fibonacci(int n) {…

    C# 2023年6月7日
    00
  • C#中通过API实现的打印类 实例代码

    以下是一个使用C#中API实现的打印类的示例代码: using System; using System.Drawing.Printing; class Program { static void Main() { PrintDocument pd = new PrintDocument(); pd.PrintPage += new PrintPageEve…

    C# 2023年5月15日
    00
  • C#委托初级使用的实例代码

    让我们来详细讲解“C#委托初级使用的实例代码”的完整攻略。 什么是委托? 在C#中,委托是一种特殊类型,它可以将方法作为参数传递给其他方法。换句话说,委托是C#中的函数指针,它可以使代码更加灵活和可扩展。 如何定义委托? 定义一个委托,可以使用 delegate 关键字。定义委托的语法如下: delegate returnType delegateName(…

    C# 2023年5月31日
    00
  • C#中数据类型的转换介绍

    C#中,数据类型的转换是非常常见的操作,涉及到的有隐式转换和显示转换两种操作。接下来,我们就来详细讲解C#中数据类型的转换介绍。 隐式转换 如果可以自动将一种类型的值转换为另一种类型,则称之为隐式类型转换。隐式转换不需要额外的语法。当源类型的值可以无精度损失地分配给目标类型时,或者当源类型的值可以强制转换为目标类型时,就发生隐式转换。 示例1: int i …

    C# 2023年5月15日
    00
  • 带你一文了解C#中的Expression

    带你一文了解C#中的Expression 什么是Expression 在C#中,Expression是一个抽象类,它代表了一个包含单个值、操作符、变量、方法调用或属性访问等逻辑的树形结构。 Expression对象可以被应用于以程序方式表示代码逻辑的情况,通常被用于了解程序上下文、编译代码或构建API。具体来说,Expression很常用于Lambda表达式…

    C# 2023年6月1日
    00
  • C# this关键字的四种用法

    C#中this关键字有以下四种用法: 1. 用于区分局部变量与成员变量 当成员变量和局部变量同名时,可以通过this关键字来区分两者。this关键字指向当前对象的引用,通过this访问的变量为成员变量。示例代码如下: class Person { private string name; // 成员变量 public Person(string name) …

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