CShell + Rivers =》图论概念学习与验证

CShell是一个轻量级可扩展的C#语法REPL工具,具体可参看另外一篇介绍《CShell (REPL) :轻量级、可扩展(dll)、 支持C#语法 的接口算法验证工具》。 

Rivers是一个用C#编写的轻量级图论工具库,包含有向图和无向图的模型,以及一系列分析图的标准算法。

百度百科:

图论〔Graph Theory〕是数学的一个分支。它以为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

图G=(V,E)是一个二元组(V,E)使得E⊆[V]的平方,所以E的元素是V的2-元子集。为了避免符号上的混淆,我们总是默认V∩B=Ø。集合V中的元素称为图G的定点(或节点、点),而集合E的元素称为边(或线)。通常,描绘一个图的方法是把定点画成一个小圆圈,如果相应的顶点之间有一条边,就用一条线连接这两个小圆圈,如何绘制这些小圆圈和连线时无关紧要的,重要的是要正确体现哪些顶点对之间有边,哪些顶点对之间没有边。 [1] 

图论本身是应用数学的一部份,因此,历史上图论曾经被好多位数学家各自独立地建立过。关于图论的文字记载最早出现在欧拉1736年的论著中,他所考虑的原始问题有很强的实际背景

当CShell与 Rivers 配合到一起,可作为辅助学习图论基本概念 ,编写脚本即可直接进行图论概念验证

以下是简单示例,欢迎一起讨论。

添加引用

using System.Linq;
using System.Collections.Generic;
using Rivers;
using Rivers.Analysis;
using Rivers.Generators;
using Rivers.Serialization.Dot;
using Rivers.Analysis.Traversal;
using Rivers.Analysis.PathFinding;  
using Rivers.Analysis.Isomorphism;
using Rivers.Analysis.Connectivity;

创建图并查看图的结构

var graph = new Graph();

// 添加节点
var node1 = graph.Nodes.Add("1");
var node2 = graph.Nodes.Add("2");
var node3 = graph.Nodes.Add("3");

//添加边
graph.Edges.Add(new Edge(node1, node2));
graph.Edges.Add(node2, node3);

//查看结构
graph.Dump();
Graph
IsDirectedTrue
Namenull
Nodes
ParentGraphNameInDegreeOutDegreeIncomingEdgesOutgoingEdgesUserDataSubGraphs
Graph
IsDirectedTrue
Namenull
Nodes 
Edges 
SubGraphs 
UserData 
101
ParentGraphSourceTargetUserData
ParentGraphSourceTargetUserData
    
KeyValuePair`2
ParentGraphNameUserDataNodes
Graph
IsDirectedTrue
Namenull
Nodes 
Edges 
SubGraphs 
UserData 
211
ParentGraphSourceTargetUserData
    
ParentGraphSourceTargetUserData
    
KeyValuePair`2
ParentGraphNameUserDataNodes
Graph
IsDirectedTrue
Namenull
Nodes 
Edges 
SubGraphs 
UserData 
310
ParentGraphSourceTargetUserData
    
ParentGraphSourceTargetUserData
KeyValuePair`2
ParentGraphNameUserDataNodes
Edges
ParentGraphSourceTargetUserData
Graph
IsDirectedTrue
Namenull
Nodes 
Edges 
SubGraphs 
UserData 
Node
ParentGraph 
Name1
InDegree0
OutDegree1
IncomingEdges 
OutgoingEdges 
UserData 
SubGraphs 
Node
ParentGraph 
Name2
InDegree1
OutDegree1
IncomingEdges 
OutgoingEdges 
UserData 
SubGraphs 
KeyValuePair`2
Graph
IsDirectedTrue
Namenull
Nodes 
Edges 
SubGraphs 
UserData 
Node
ParentGraph 
Name2
InDegree1
OutDegree1
IncomingEdges 
OutgoingEdges 
UserData 
SubGraphs 
Node
ParentGraph 
Name3
InDegree1
OutDegree0
IncomingEdges 
OutgoingEdges 
UserData 
SubGraphs 
KeyValuePair`2
SubGraphs
ParentGraphNameUserDataNodes
UserData
KeyValuePair`2

判别图的分类

bool cyclic = graph.IsCyclic();
bool connected = graph.IsConnected();
bool tree = graph.IsTree();
bool regular = graph.IsRegular();
bool complete = graph.IsComplete();

路径各个节点遍历路径 深度优先

var traversal = new DepthFirstTraversal();
var order = new TraversalOrderRecorder(traversal);
traversal.Run(node1);
foreach (var node in order.GetTraversal()) 
{
    var es = node.GetReachableNodes();
    string.Join("-",es.Select(s=>s.Name)).Dump();
     
}

输出结果:

1-2-3

2-3

3

Rivers还有许多其他特色功能,如创建序列图

 // 创建图并输出所有节点
var generator = new PathGenerator(true, 5);
var pathGraph = generator.GenerateGraph();
string.Join("->",pathGraph.Nodes.Select(s=>s.Name))

1->2->3->4->5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值