C#,图论与图算法,图(Graph)的数据结构设计与源代码

因为后面即将发布的大量有关“图”的算法与源代码都需要用到下面的这些基础数据,为避免大家去下载,特意先发布于此。

一、图(Graph)的基础知识

图(Graph)是一组对象的图示,其中一些对象对通过链接连接。互连对象由称为顶点的点表示,连接顶点的链接称为边。

形式上,图是一对集(V,E),其中V是顶点集,E是连接顶点对的边集。

图形数据结构

数学图可以用数据结构表示。我们可以使用顶点数组和二维边数组来表示图。在继续之前,让我们先熟悉一些重要的术语−

顶点− 图的每个节点都表示为一个顶点。在以下示例中,带标签的圆表示顶点。因此,A到G是顶点。我们可以使用下图所示的数组来表示它们。这里A可以通过索引0来标识。B可以使用索引1等进行识别。

− 边表示两个顶点之间的路径或两个顶点之间的线。在以下示例中,从A到B、B到C等的线表示边。我们可以使用二维数组来表示数组,如下图所示。这里AB可以表示为第0行第1列的1,BC可以表示为第1行第2列的1,依此类推,其他组合保持为0。

邻接关系− 如果两个节点或顶点通过边相互连接,则它们是相邻的。在以下示例中,B与A相邻,C与B相邻,依此类推。

路径− 路径表示两个顶点之间的边序列。

二、图的基本操作

以下是图形的基本主要操作:

添加顶点 — 将顶点添加到图形中。

添加边 — 在图形的两个顶点之间添加边。

显示顶点 — 显示图形的顶点。

遍历 — 深度优先遍历,宽度优先遍历;

布局 — 图的布局算法

三、图的相关数据

1、节点

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{/// <summary>/// 图的结点(坐标)信息/// </summary>public class Node{/// <summary>/// 编号/// </summary>public int Id { get; set; } = 0;/// <summary>/// X坐标/// </summary>public double X { get; set; } = 0.0;/// <summary>/// Y坐标/// </summary>public double Y { get; set; } = 0.0;//public int Weight { get; set; } = 0;/// <summary>/// 默认构造函数/// </summary>public Node() {}public Node(int id) {Id = id;}/// <summary>/// 长度(原点距离)/// </summary>public double Length{get{double len = LengthSquare;if (Math.Abs(len) < float.Epsilon) return 0.0;return Math.Sqrt(len);}}/// <summary>/// 长度平方/// </summary>public double LengthSquare{get{return (X * X) + (Y * Y);}}/// <summary>/// 缩放/// </summary>/// <param name="rate"></param>public void Scale(double rate){X *= rate;Y *= rate;}/// <summary>/// 移动到目的点/// </summary>/// <param name="x"></param>/// <param name="y"></param>public void MoveTo(double x, double y){X = x;Y = y;}/// <summary>/// 移动/// </summary>/// <param name="delta"></param>public void Move(Node delta){this.X += delta.X;this.Y += delta.Y;}/// <summary>/// 加号重载/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public static Node operator +(Node a, Node b){Node c = new Node();c.X = a.X + b.X;c.Y = a.Y + b.Y;return c;}/// <summary>/// 减号重载/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>public static Node operator -(Node a, Node b){Node c = new Node();c.X = a.X - b.X;c.Y = a.Y - b.Y;return c;}}
}

2、边

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public class Edge{/// <summary>/// 起点(第一点)编号/// </summary>public int First { get; set; } = -1;/// <summary>/// 终点(第二点)编号/// </summary>public int Second { get; set; } = -1;/// <summary>/// 权值/// </summary>public int Weight { get; set; } = 0;/// <summary>/// 默认构造函数/// </summary>public Edge(){}/// <summary>/// 两点构造函数/// </summary>/// <param name="f"></param>/// <param name="s"></param>public Edge(int f, int s){First = f;Second = s;}/// <summary>/// 两点及权值构造函数/// </summary>/// <param name="f"></param>/// <param name="s"></param>/// <param name="w"></param>public Edge(int f, int s, int w){First = f;Second = s;Weight = w;}}
}

3、图

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public partial class Graph{/// <summary>/// 是否为有向图?/// </summary>public bool Direction { get; set; } = false;/*/// <summary>/// 节点编码的起始编号0或1/// </summary>public int Node_Index_Start { get; set; } = 0;/// <summary>/// 节点编码的结束编号/// </summary>public int Node_Index_End { get; set; } = 0;*//// <summary>/// 节点总数/// </summary>public int Node_Number { get; set; } = 0;/*/// <summary>/// 连线编码的起始编号0或1/// </summary>public int Edge_Start { get; set; } = 0;*//// <summary>/// 连接线总数/// </summary>public int Edge_Number { get; set; } = 0;/// <summary>/// 节点编码列表/// </summary>public List<Node> Nodes { get; set; } = new List<Node>();/// <summary>/// 连接线列表/// </summary>public List<Edge> Edges { get; set; } = new List<Edge>();/// <summary>/// 节点邻接表/// </summary>public List<int>[] Adjacency { get; set; } = null;/// <summary>/// 邻接矩阵/// </summary>public int[,] Matrix { get; set; } = null;public Graph(){}public Graph(int v, int e = 0, bool direct = false){Direction = direct;Node_Number = v;Edge_Number = e;Adjacency = new List<int>[Node_Number + 1];for (int i = 0; i <= Node_Number; i++){Adjacency[i] = new List<int>();}}public void AddEdge(int a, int b){Adjacency[a].Add(b);if (Direction == false){Adjacency[b].Add(a);}}public void AddEdge(int a, int b, int w){AddEdge(a, b);Edges.Add(new Edge(a, b, w));}public void AddEdge(int idx, int a, int b, int w){Edges[idx] = new Edge(a, b, w);}public void AddNode(int a){if (!Nodes.Exists(t => t.Id == a)){Nodes.Add(new Node(a));}}/// <summary>/// 按三元组构造图数据/// 三元数组为: {source,destination,weight}/// </summary>/// <param name="ternary_array">三元数据</param>public Graph(int[,] ternary_array, bool dir = false){// 有向图?无向图?Direction = dir;Nodes = new List<Node>();Edges = new List<Edge>();Edge_Number = ternary_array.GetLength(0);for (int i = 0; i < ternary_array.GetLength(0); i++){int n1 = ternary_array[i, 0];int n2 = ternary_array[i, 1];int wt = ternary_array[i, 2];AddEdge(n1, n2, wt);}}/// <summary>/// 按关联矩阵数据构建图/// [N x N],元素=0,无连接,>0 有连接线及weight/// </summary>/// <param name="v">节点数</param>/// <param name="e">连边数</param>/// <param name="matrix">关联矩阵</param>public Graph(int[,] matrix){Node_Number = matrix.GetLength(0);Nodes = new List<Node>();Edges = new List<Edge>();Matrix = new int[Node_Number, Node_Number];for (int i = 0; i < Node_Number; i++){for (int j = 0; j < Node_Number; j++){if (matrix[i, j] > 0){AddEdge(i, j, matrix[i, j]);Matrix[i, j] = matrix[i, j];}}}}public Edge FindEdge(int a, int b){foreach (Edge e in Edges){if (e.First == a && e.Second == b){return e;}if (Direction == false){if (e.First == b && e.Second == a){return e;}}}return null;}/// <summary>/// 按邻接表的构造函数/// </summary>/// <param name="adj"></param>public Graph(List<List<int>> adj, bool dir = false){// 有向图?无向图?Direction = dir;Node_Number = adj.Count;Nodes = new List<Node>();Edges = new List<Edge>();// 邻接矩阵Adjacency = adj.ToArray();int idx = 1;foreach (List<int> xu in adj){foreach (int xv in xu){AddEdge(idx, xv);}idx++;}}/// <summary>/// 邻接表 转为 邻接矩阵/// 1 起步!/// </summary>/// <returns></returns>public int[,] AdjacencyMatrix(){if (Matrix == null){Matrix = new int[Node_Number + 1, Node_Number + 1];int idx = 0;foreach (List<int> xu in Adjacency){// 因为 Adjacency[0] 没有被使用!跳过!if (idx > 0){foreach (int xv in xu){Matrix[idx, xv] = 1;}}idx++;}}return Matrix;}}
}

POWER BY TRUFFER.CN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/544755.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

政安晨:【深度学习处理实践】(九)—— Transformer架构

咱们接着这个系列的上一篇文章继续&#xff1a; 政安晨&#xff1a;【深度学习处理实践】&#xff08;八&#xff09;—— 表示单词组的两种方法&#xff1a;集合和序列https://blog.csdn.net/snowdenkeke/article/details/136762323 Transformer是一种架构&#xff0c;用于在…

hot100 -- 矩阵

&#x1f442; Peter Pan - kidult. - 单曲 - 网易云音乐 &#x1f442; Bibliothque&#xff08;图书馆&#xff09; - Jasing Rye - 单曲 - 网易云音乐 目录 &#x1f33c;前言 &#x1f33c;二分模板 &#x1f382;矩阵置零 AC 标记数组 AC 标记变量 &#x1f6a9;…

网络安全等级测评师考试培训可以参考哪些资料?

网络安全是国家安全的重要组成部分&#xff0c;也是企业安全的重中之重&#xff1b;而网络安全等级测评师则是守护这一安全领域的重要力量。所以专业的网络安全等级测评师是非常重要。作为专业的网络安全等保测评师&#xff0c;他们肩负着对信息系统进行安全评估、发现潜在风险…

【01】htmlcssgit

01-前端干货-html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全…

Github Copilot 工具,无需账号,一键激活

① 无需账号&#xff0c;100%认证成功&#xff01;0风险&#xff0c;可联网可更新&#xff0c;&#xff0c;支持copilot版本升级&#xff0c;支持chat ② 支持windows、mac、linux系统等设备 ③一号通用&#xff0c;支持所有IDE(AppCode,CLion,DataGrip,GoLand,IntelliJ IDEA …

校园闲置物品交易网站 |基于springboot框架+ Mysql+Java+Tomcat的校园闲置物品交易网站设计与实现(可运行源码+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 用户功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen…

EXCEL+PYTHON学习3

1&#xff09; 遍历一个SHEET&#xff0c;无非就是两个循环&#xff0c;rows属性是取得所有行。 fn data3_16.xlsx wb openpyxl.load_workbook(fn) ws wb.active for row in ws.rows:for cell in row:print(cell.value, end )print() 2&#xff09; 返回工作表的最小行数…

【C语言】函数栈帧---函数的创建于销毁过程剖析(一览无遗)

目录 前言&#xff1a; 1.铺垫 寄存器 main函数被谁调用 2.正题 结论&#xff1a; 前言&#xff1a; 学习这么久以来&#xff0c;可能有很多疑问&#xff1a;局部变量怎么创建的&#xff1f;为什么局部变量的值是随机的&#xff1f;函数是怎么传参的&#xff1f;传参的顺…

2024最新手赚手机软件APP下载排行网站源码及应用商店源码

这是一款简洁蓝色的手机软件下载应用排行、平台和最新发布网站&#xff0c;采用响应式织梦模板。主要包括主页、APP列表页、APP详情介绍页、新闻资讯列表、新闻详情页、关于我们等模块页面。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88898956 更…

java serlvet 高校学生画像平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目echarts图形展现

一、源码特点 java serlvet 高校学生画像平台系统是一套完善的java web信息管理系统 系统采用serlvetdaobean 模式开发本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCA…

yocto 集成ros2(基于raspberrypi 4B)

yocto 集成ros2 上一小节已经使用yocto编译出了raspberrypi 4B的image。并且成功刷机并且启动登陆&#xff1a; 链接: yocto 编译raspberrypi 4B并启动 本节我们将ros2机器人操作系统移植到我们的yocto系统里面。 1. 下载ros layer 上小节我们编译的yocto image是基于kirkst…

HarmonyOS(二十)——管理应用拥有的状态之LocalStorage(页面级UI状态存储)

LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内&#xff0c;在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器&#xff1a;LocalStorageProp和LocalS…