当前位置:网站首页>C#实现基于广度优先BFS求解无权图最短路径----完整程序展示
C#实现基于广度优先BFS求解无权图最短路径----完整程序展示
2022-07-01 02:58:00 【黄昏和星空】
本文介绍C#实现基于广度优先BFS求解无权图最短路径----完整程序展示
1、代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 图的应用__基于BFS算法求解的那元最短路径
{
using VertexType = System.Char;//顶点数据类型别名声明
using EdgeType = System.Int16;//带权图中边上权值的数据类型别名声明
class Program
{
public const int MAxVertexNum = 100;//顶点数目的最大值
public const int MAXSize = 100;
static void Main(string[] args)
{
MGraph G = new MGraph();
int u;
int[] d = new int[MAxVertexNum];
G.vexnum = 8;
G.arcnum = 8;
G.vex = new VertexType[MAxVertexNum];
G.Edge = new EdgeType[MAxVertexNum, MAxVertexNum];
for (int i = 0; i < MAxVertexNum; ++i)
{
for (int j = 0; j < MAxVertexNum; ++j)
{
G.Edge[i, j] = 0;
}
}
//图的赋值
G.vex[0] = ‘a’; G.vex[1] = ‘b’; G.vex[2] = ‘c’; G.vex[3] = ‘d’; G.vex[4] = ‘e’; G.vex[5] = ‘f’;
G.vex[6] = ‘g’; G.vex[7] = ‘h’;
G.Edge[0, 1] = 1; G.Edge[0, 2] = 1;
G.Edge[1, 0] = 1; G.Edge[1, 3] = 1; G.Edge[1, 4] = 1;
G.Edge[2, 0] = 1; G.Edge[2, 5] = 1; G.Edge[2, 6] = 1;
G.Edge[3, 1] = 1;
G.Edge[4, 1] = 1; G.Edge[4, 7] = 1;
G.Edge[5, 2] = 1;
G.Edge[6, 2] = 1;
G.Edge[7, 4] = 1;
//广度优先
Console.WriteLine(“广度优先:”);
BFSTraverse(G);
u = 3;
Console.WriteLine();
Console.WriteLine(“顶点”+G.vex[u]+“到各点最短路径:”);
BFS_MIN_Distance(G,u,ref d);
for (int i=0;i<G.vexnum;++i) {
Console.Write(d[i]+" ");
}
Console.Read();
}
/// <summary>
/// 图的定义--邻接矩阵
/// </summary>
public struct MGraph
{
public VertexType[] vex;//顶点表数组
public EdgeType[,] Edge;//临接矩阵、边表
public int vexnum, arcnum;//图的当前顶点数和弧数
}
/// <summary>
/// 图的定义--邻接表法
/// </summary>
public class ArcNode
{//边表节点
public int adjvex;
public ArcNode next;
}
public class VNode
{ //顶点表节点
VertexType data;//顶点信息
ArcNode first;//只想第一条依附改顶点的弧的指针
}
public class ALGraph
{
VNode[] vertices; //邻接表
int vexnum, arcnum;//图的顶点数和弧数
}
/// <summary>
/// 对图G的广度优先遍历
/// </summary>
static void BFSTraverse(MGraph G)
{
bool[] visited = new bool[MAxVertexNum];//访问标记数组
for (int i = 0; i < G.vexnum; ++i)
visited[i] = false;//访问标记数组初始化
SqQueue Q = new SqQueue();
Q.data = new int[MAxVertexNum];//需要对队列数组进行new
InitQueue(ref Q);//队列初始化
for (int i = 0; i < G.vexnum; ++i)
{
if (!visited[i])
BFS(G, i, ref visited, ref Q);
}
}
static void BFS(MGraph G, int v, ref bool[] visited, ref SqQueue Q)
{
visit(G, v);//首先访问初始顶点v
visited[v] = true;//对v做已访问标记
EnQueue(ref Q, v);//顶点v入队列
while (!isEmpty(Q))
{
DeQueue(ref Q, ref v);//顶点v出队列
for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))
{
if (!visited[w])
{
visit(G, w); //访问顶点w
visited[w] = true;//对w做已访问标记
EnQueue(ref Q, w);
}
}
}
}
//控制台打印遍历点
static void visit(MGraph G, int v)
{
Console.Write(G.vex[v] + " ");
}
//查找G中,V顶点的首个邻接点
static int FirstNeighbor(MGraph G, int v)
{
int b = -1;
for (int i = 0; i < G.vexnum; ++i)
{
if (G.Edge[v, i] == 1)
{
b = i;
break;
};
}
return b;//返回首个邻接点
}
//查找G中,V顶点的W邻节点后的下一个邻接点
static int NextNeighbor(MGraph G, int v, int w)
{
int b = -1;
for (int i = w + 1; i < G.vexnum; ++i)
{
if (G.Edge[v, i] == 1)
{
b = i;
break;
};
}
return b;//返回下一个邻接点
}
//求单源最短路径,即u到各顶点的最短路径长度
static void BFS_MIN_Distance(MGraph G,int u,ref int[] d) {
bool[] visited = new bool[MAxVertexNum];//访问标记数组
SqQueue Q = new SqQueue();
InitQueue(ref Q);
Q.data = new int[MAxVertexNum];
for (int i=0;i<G.vexnum;++i) {
visited[i] = false;
d[i] = -1;//初始化路径长度。-1表示没有
}
visited[u] = true;d[u] = 0;
EnQueue(ref Q,u);
while (!isEmpty(Q)) {
DeQueue(ref Q, ref u);
for (int w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w)) {
if (!visited[w]) {
d[w] = d[u] + 1;
visited[w] = true;
EnQueue(ref Q, w);
}
}
}
}
/// <summary>
/// 队列结构体定义
/// </summary>
public struct SqQueue
{
public int[] data;//队列存放的元素
public int front, real;//队头和队尾指针
}
/// <summary>
/// 队列初始化
/// </summary>
/// <param name="Q"></param>
static void InitQueue(ref SqQueue Q)
{
Q.real = Q.front = 0;
}
/// <summary>
/// 判断队列是否为空
/// </summary>
/// <param name="Q"></param>
/// <returns></returns>
static bool isEmpty(SqQueue Q)
{
if (Q.front == Q.real) { return true; }
else return false;
}
/// <summary>
/// 入队
/// </summary>
/// <param name="Q"></param>
/// <param name="x"></param>
/// <returns></returns>
static bool EnQueue(ref SqQueue Q, int x)
{
if ((Q.real + 1) % MAXSize == Q.front) { return false; }
Q.data[Q.real] = x;
Q.real = (Q.real + 1) % MAXSize;
return true;
}
static bool DeQueue(ref SqQueue Q, ref int x)
{
if (Q.real == Q.front) { return false; }
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MAXSize;
return true;
}
}
}
2、测试结果

边栏推荐
- Introduction to the core functions of webrtc -- an article to understand peerconnectionfactoryinterface rtcconfiguration peerconnectioninterface
- [QT] add knowledge supplement of third-party database
- Sampling Area Lights
- Lenovo x86 server restart management controller (xclarity controller) or TSM method
- Borrowing constructor inheritance and composite inheritance
- So easy 将程序部署到服务器
- Poj-3486-computers[dynamic planning]
- Example of Huawei operator level router configuration | example of configuring optionc mode cross domain LDP VPLS
- Summary of problems encountered in debugging positioning and navigation
- 一文讲解发布者订阅者模式与观察者模式
猜你喜欢

最新接口自动化面试题

Introduction and basic knowledge of machine learning
![[applet project development -- Jingdong Mall] classified navigation area of uni app](/img/cb/b0b79444dc90980cd2220ff9e68549.png)
[applet project development -- Jingdong Mall] classified navigation area of uni app

伺服第二编码器数值链接到倍福PLC的NC虚拟轴做显示

Huawei operator level router configuration example | BGP VPLS and LDP VPLS interworking example

基于Pytorch完整的训练一个神经网络并进行验证

Lenovo x86 server restart management controller (xclarity controller) or TSM method

Example of Huawei operator level router configuration | example of configuring optionc mode cross domain LDP VPLS

Densenet network paper learning notes

So easy deploy program to server
随机推荐
How to open a stock account? Also, is it safe to open an account online?
robots. Txt restrict search engine inclusion
世界上最好的学习法:费曼学习法
CX5120控制汇川IS620N伺服报错E15解决方案
安装VCenter6.7【VCSA6.7(vCenter Server Appliance 6.7) 】
PTA 1017
Install vcenter6.7 [vcsa6.7 (vCenter server appliance 6.7)]
js中的原型和原型链
Mouse over effect 7
MCU firmware packaging Script Software
别再说不会解决 “跨域“ 问题啦
Densenet network paper learning notes
Summary of problems encountered in debugging positioning and navigation
最新接口自动化面试题
Use ipmitool to configure BMC network and user information of X86 server
LeetCode_ Stack_ Difficulties_ 227. basic calculator (excluding multiplication and division)
Network address translation (NAT) technology
PHP batch Excel to word
股票开户安全吗?上海股票开户步骤。
Ipmitool download address and possible problems during compilation and installation