一个简陋的个人小项目,也是个人第一个真正意义上的独立项目——Graph

由来

我最早接触到图这个概念是在大二的离散数学当中图论相关的内容,当时是以著名的哥尼斯堡七桥问题引出图论的概念,现在依然记忆犹新(不过只是记得这个名字,具体的解题思路我重新温习了一下才想起来),当时也提出了求最短路径的迪杰斯特拉算法,不过没有用编程语言具体实现。

之后在数据结构的学习中,又出现了图的相关知识,提出了在计算机中存储图的几种方式,我们学校的课程中学习的是邻接表和邻接矩阵,同时也用编程语言实现了具体的算法。

离散数学中的图用几何图形表示,清晰明了,但实现算法时步骤不清晰;邻接矩阵和邻接表适合实现算法,但可视化效果不好,只能用字符串输出。那么能不能写一个小项目,既能实现算法,又能用可视化较好的形式显示出来呢?之前其他人可能也写过同样功能的项目,但这个想法是我自己独立提出的,而且我有一套自己独特的实现方法,至于实现方法,请看下文详细讲解。

DOT语言

DOT语言是贝尔实验室发明的绘图语言,它可以非常方便地绘制出数学概念中的图,包括有向图和无向图,可以在顶点内添加信息,也可以在边上添加信息,还可以设置不同的顶点形状和边的形状等等功能,它的文档在此:https://graphviz.gitlab.io/_pages/doc/info/lang.html

下面我给出一个DOT语言的使用示例,代码和绘图效果如下:

graph g{
    a--b--c,d--a
}

我是在使用Markdown Preview Enhanced插件的过程中了解到了DOT语言。在Graph项目中,DOT语言是非常重要的一环,它就可以实现将文本到可视化图形的转换

DOT语言最早是在桌面端的一个应用程序叫做Graphviz中实现的,不过现在已经有人在浏览器端用一个名为Viz.js的工具来实现了,也正符合了那句话:“能用 js 实现的功能,最终一定会用 js 实现”。Viz.js也是这个项目主要的依赖文件

Graph项目目前实现的功能

  • 输入邻接矩阵生成无向图
  • 输入邻接矩阵生成有向图
  • 输入邻接表生成无向图
  • 输入邻接表生成有向图
  • 输入邻接矩阵、开始点和结束点的信息,计算最短路径并生成可视化结果
  • 输入邻接表、开始点和结束点的信息,计算最短路径并生成可视化结果

Graph项目的简要工作流程

Graph项目的Github地址

https://github.com/aopstudio/Graph

生成的HTML文件的位置

  • 完整的有向图或无向图:D:/graph.html
  • 要求的最短路径示意图:D:/shortestPath.html

主函数代码分析和使用效果

目前我还没有写输入模块,只能在源代码中给定数据来生成图。在源代码中给出五个顶点,

String[] nodes= {"北京","上海","台北","泰州","宁波"};

初始化邻接矩阵的边矩阵,再给定边的权值

int[][] m=new int[nodes.length][nodes.length];
m[0][1]=1213;
m[1][4]=200;
m[1][2]=900;
m[4][2]=600;
m[0][3]=1200;
m[3][4]=400;

将存储边信息的m和存储顶点信息的node包装成我自定义的数据结构MatrixGraph

MatrixGraph mg=new MatrixGraph(m,nodes);

调用MatrixGraph的generateDG方法生成完整图的DOT语言代码,调用shortestPath生成最短路径示意图的DOT语言代码,这里输入的参数0和4代表顶点编号,0是指北京,4是指宁波,也就是求从北京到宁波的最短路径

String graph=mg.generateDG();
String shortestPath=mg.printShortestPath(0, 4);

再将DOT语言代码嵌入到HTML代码中

String html1=GenerateHTML.Generate(graph);
String html2=GenerateHTML.Generate(shortestPath);

最后将HTML代码写入文件

WriteFile.write(html1);
WriteFile.writeShortest(html2);

生成的效果如下:

  • 完整图
  • 最短路径示意图

原文地址:https://www.cnblogs.com/aopstudio/p/10732523.html

时间: 2024-10-09 22:58:08

一个简陋的个人小项目,也是个人第一个真正意义上的独立项目——Graph的相关文章

在开源中国(oschina)上创建托管项目

***************************************************************** 目标: 1.能上传自己的项目到oschina上并且进行管理 2.能进行多人开发项目 ***************************************************************** 实现:分二步讲解 第一步:如果上传项目到oschina上 第二步:怎样来共同开发 ***********************************

利用java开发一个双击执行的小程序

之前我们利用java写了很多东西,但是好像都没有什么实际意义. 因为有意义桌面小程序怎么都得有个界面,可是界面又不太好搞.或者 了解到这一层的人就少之又少了. 呀,是不是还得开辟一些版面来介绍awt和 swing... 算了 先把这个 双击执行的小程序 贡献出来. 这次 在分享一下源代码[以前还没有上传过源代码,布置怎么个搞法] 要求是: 输入一个 后缀名,然后输入所在目录,然后 点击查找,比如我们可以 输入F:\,然后查找 F盘下面的所有后缀名为比如.pdf 举例: 主要是 看了很多 资源,然

两天快速开发一个自己的微信小程序

一.写在前面 1.为什么要学小程序开发? 对于前端开发而言,微信小程序因为其简单快速.开发成本低.用户流量巨大等特点,也就成了前端开发工程师必会的一个技能. 2.先放上我做的小程序 可以在微信小程序搜索"悬笔e绝",或者用微信扫描下面的二维码哦 (1)欢迎页:这个logo是当年念大学给社团做的logo,苦学了整整一周的PS啊... (2)首页:轮播头图,天气,豆瓣电影正在热映 (3)全国城市切换页 (4)天气详情页 (5)地图周边服务 (6)豆瓣电影 (7)热点新闻 (8)更多页面 3

快速开发一个自己的微信小程序

一.写在前面 1.为什么要学小程序开发? 对于前端开发而言,微信小程序因为其简单快速.开发成本低.用户流量巨大等特点,也就成了前端开发工程师必会的一个技能. 2.先看看小程序效果 (1)欢迎页 (2)首页:轮播头图,天气,豆瓣电影正在热映 (3)全国城市切换页 (4)天气详情页 (5)地图周边服务 (6)豆瓣电影 (7)热点新闻 (8)更多页面 3.开发准备: (1)有人开玩笑说,会vue小程序根本都不用学: 微信小程序虽然是腾讯自己搞的,但是核心的思想跟vue等框架是一样一样的哦~ (2)善于

【转】两天快速开发一个自己的微信小程序 悬笔e绝 www.xuanbiyijue.com

文章出处:https://www.cnblogs.com/xuanbiyijue/p/7980010.html 作者: 悬笔e绝 www.xuanbiyijue.com 两天快速开发一个自己的微信小程序 一.写在前面 1.为什么要学小程序开发? 对于前端开发而言,微信小程序因为其简单快速.开发成本低.用户流量巨大等特点,也就成了前端开发工程师必会的一个技能. 2.先放上我做的小程序 可以在微信小程序搜索“悬笔e绝”,或者用微信扫描下面的二维码哦 (1)欢迎页:这个logo是当年念大学给社团做的l

用 C# 写一个 Redis 数据同步小工具

用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一个 nodejs 的小工具,结果折腾了好久都没装上...于是就自己写了这个小工具) 之所以自己写一个工具而不是利用 redis 备份机制来实现,主要是因为我们用的是 redis 云服务,不能像自己的服务器一样 SSH 上去一顿操作,要把云服务的 redis 数据同步到自己服务器上的 redis 实例

使用java基础实现一个简陋的web服务器软件

使用java基础实现一个简陋的web服务器软件 1.写在前面 大学已经过了一年半了,从接触各种web服务器软件已经有一年多了,从大一上最开始折腾Windows电脑自带的IIS开始,上手了自己的第一个静态网站,从此开启了web方向学习的兴趣.到现在,从陪伴了javaweb阶段的Tomcat走来,也陆续接触了jetty,Nginx等web服务器软件.但是,这些web服务器的软件也一直都是开箱即用,从未探究过其背后的原理.今天,尽量用最简单的java代码,实现一个最简陋的web服务器软件,揭开web服

继上一个坑有一个坑(微信小程序一键登录之无法识别json数据)

前言:  作为一个运维人员不背锅,谁背呢! 正文: 开发人员和前端人员写好了微信小程序,然后坑出现了,安卓上打死不能一键登录.然后开始排查, 开始从数据上着手,不管是使用postman进行模拟测试数据,还是通过抓包查看数据,无任何问题,但是就是微信小程序无法判断改数据是json数据. 后来继续测试,打console.log 断点,抛数据出来查看发现 该数据 确实也存在问题,直接使用res.data 使用typeof 查看 确实为字符串,但是使用JSON.parse 却抛的微信小程序 百度都不能百

一个php多态性的小例子

多态性在 OO 中指 "语言具有以不同方式处理不同类型对象的能力",但 PHP 是弱类型语言,在这一点上就比较弱,仅有 instance of 可以用于判断对象的类型 多态性的优点:让代码更接近生活中的真实情况 一下是一个非常简单的多态性例子,描述在电脑上安装不同操作系统,linux, OS X, windows 和 computer 是两种不同类型的对象. interface os{ function name(); function creator(); } class linux