七桥问题c语言程序数据结构,数据结构与算法学习——图论

什么是图?

在计算机程序设计中,图结构也是一种非常常见的数据结构

但是图论其实是一个非常大的话题

图结构是一种与树结构有些相似的数据结构

图论是数学的一个分支,并且在数学概念上,树是图的一种

它以图为研究对象,研究顶点和边组成的图形的数学理论和方法

主要研究的目的是事务之间的关系,定点代表事务,边代表两个事物间的关系

图的现实案例

人与人之间的关系网

甚至科学家们在观察人与人之间的关系网时,还发现了六度空间理论

六度空间理论

理论上认为世界任何不认识的两个人只需要很少的中间人就可以建立起联系。

并非一定经过六步,只是需要很少的步骤

bVcIw5H

图通常有什么特点?

一组顶点:通常用V(Vertex)表示顶点的集合

一组边:通常用E(Edge)表示边的集合

边是顶点和顶点之间的连线

边可以是有向的,也可以是无向的

比如A—-B,通常表示无向

A—->B,通常表示有向

七桥问题

图形一笔画完的条件:有0个奇点或有2个奇点

我们来看一下口这个字有4个偶点0个奇点所以一笔能够画完(由双数的边连接的都是偶点,由单数的边连接的都是奇点)

bVcIw54

田字不能一笔画成,因为它的奇点有四个(红色)违反了规则。

bVcIw59

图的术语

顶点

顶点刚才我们已经介绍过了,表示图中的一个节点

比如下图中的数字

边刚才我们也介绍过了,表示顶点和顶点之间的连线

比如地铁站中两个站点之间的直接连线,就是一个边

注意:这里的边不要叫做路径,路径有其他的概念,待会儿我们会介绍

下图中 0 – 1有一条边,1 – 2有一条边,0 – 2没有边

相邻顶点

由一条边连接在一起的顶点称为相邻顶点

一个顶点的度是相邻顶点的数量

比如0顶点和其他两个顶点相连,0顶点的度是2

比如1顶点和其他四个顶点相连,1顶点的度是4

路径

路径是顶点v1,v2…,vn的一个连续序列,比如下图中0 1 5 9 就是一条路径

简单路径:简单路径要求不包含重复的顶点,比如0 1 5 9是一条简单路径

回路:第一个顶点和最后一个顶点相同的路径称为回路 比如0 1 5 6 3 0

无向图:

下图图就是一张无向图,因为所有的边都没有方向

比如 0 – 1之间有边,那么说明这条边可以保证0 ->1,也可以保证1 ->0

无权图:

下图就是一张无权图(边没有携带权重),图中的边是没有任何意义的。

不能说4-9的边比0-1的边更远或者更长。

bVcIw6s

有向图

有向图表示的图中的边是有方向的

比如0->1,不能保证一定可以1->0,要根据方向来定,比如下图就是一张有向图

带权图

带权图表示边有一定的权重

这里的权重可以是任意你希望表示的数据

比如距离或者花费的时间或者票价

bVcIw6F

图的表示

怎么在程序中表示图呢?

我们知道一个图包含很多顶点,另外包含顶点和顶点之间的连线(边)

这两个都是非常重要的图信息,因此都需要在程序中提现出来

顶点的表示相对简单,我们先讨论顶点的表示

上面的顶点,我们抽象成1 2 3 4,也可以抽象成A B C D

在后面的案例中,我们使用A B C D

那么这些A B C D我们可以使用一个数组来存储起来(存储所有的顶点)

当然A B C D有可能还表示其他含义的数据(比如村庄的名字)

那么边如何表示呢?

因为边是两个顶点之间的关系,所以表示起来会稍微麻烦一些

邻接表

邻接表由图中每个顶点以及和顶点相邻的顶点列表组成

这个列表有很多种方式来存储:数组/链表/哈希表都可以

bVcIw67

图片解析

比如我们要表示和A顶点有关联的顶点(边),A和B/C/D有边

那么我们可以通过A找到对应的数组/链表/哈希表,再取出其中的内容即可

邻接表的问题:

邻接表计算出度是比较简单的(出度:指向别人的数量,入度:指向自己的数量)

邻接表如果需要计算有向图的入度,那么是非常麻烦的事情

它必须构造一个逆邻接表,才能有效的计算入度,但是在开发中出度相对用的比较少

图的遍历思想

图的遍历思想和树的遍历思想是一样的

图的遍历意味着需要将图中每个顶点都访问一遍,并且不能有重复的访问

有两种算法可以对图进行遍历

广度优先搜索(Breadth-first Search,简称BFS)

深度优先搜索(Depth-First Search,简称DFS)

两种遍历算法都需要明确指定第一个被访问的顶点

遍历的思想

两种算法的思想:

BFS:基于队列,入队列的顶点先被探索

DFS:基于栈或使用递归,通过将顶点存入栈中,顶点是沿着路径被探索的,存在新的相邻顶点就去访问

为了记录顶点是否被访问过,我们同时使用三种颜色来反映他们的状态:

白色:表示该顶点还没有被访问过

灰色:表示该顶点被访问过,但未被探索过

黑色:表示该顶点被访问过且被完全探索过

广度优先搜索

广度优先搜索算法思路:

广度优先算法会从指定的第一个顶点开始遍历图,先访问其所有的相邻节点,就像一次访问图的一层,换句话说,就是先宽后深的访问顶点

bVcIw76

深度优先搜索思路:

深度优先搜索算法将会从第一个指定的顶点开始遍历图,沿着路径知道这条路经最后被访问了。

接着原路回退并探索下一条路径

bVcIw9b

代码实现

class Graph {

constructor() {

this.vertexes = [];

this.edges = [];

}

// 添加顶点

addVertex(v) {

this.vertexes.push(v);

this.edges[v] = [];

}

// 添加边

addEdge(v1, v2) {

this.edges[v1].push(v2);

this.edges[v2].push(v1);

}

// toString

toString() {

let resString = '';

for (let i = 0; i < this.vertexes.length; i++) {

let v = this.vertexes[i];

resString += v + '->';

for (let j = 0; j < this.edges[v].length; j++) {

resString += this.edges[v][j]

}

resString += 'n'

}

return resString;

}

// 初始化颜色

initColors() {

let colors = [];

for (let i = 0; i < this.vertexes.length; i++) {

let v = this.vertexes[i];

for (let j = 0; j < this.edges[v].length; j++) {

colors[this.edges[v][j]] = 'white'

}

}

return colors;

}

// 广度遍历 bfs bfs(v, handler) {

let colors = this.initColors();

let items = [];

items.push(v);

colors[v] = 'gray';

while (items.length > 0) {

let headData = items.shift();

for (let i = 0; i < this.edges[headData].length; i++) {

let e = this.edges[headData][i];

if (colors[e] == 'white') {

colors[e] = 'gray';

items.push(e)

}

}

handler(headData)

colors[v] = 'black';

}

}

// dfs 深度遍历

dfs(v, handler) {

let colors = this.initColors();

this.dfsSearch(v, handler, colors)

}

dfsSearch(v, handler, colors) {

colors[v] = 'gray';

handler(v);

colors[v] = 'black';

for (let i = 0; i < this.edges[v].length; i++) {

let e = this.edges[v][i];

if (colors[e] == 'white') {

this.dfsSearch(e, handler, colors)

}

}

}

}

代码测试

let graph = new Graph();

//添加顶点操作

let myVertexes = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'];

myVertexes.forEach(v => graph.addVertex(v));

//添加边操作

graph.addEdge('A', 'B');

graph.addEdge('A', 'C');

graph.addEdge('A', 'D');

graph.addEdge('B', 'E');

graph.addEdge('B', 'F');

graph.addEdge('C', 'G');

graph.addEdge('D', 'G');

graph.addEdge('D', 'H');

graph.addEdge('E', 'I');

//toString方法测试

alert(graph.toString());

//深度遍历测试

let resString = '';

graph.dfs(myVertexes[0], function (key) {

resString += key + ' '

})

alert(resString)

//广度遍历测试

let resString1 = '';

graph.bfs(myVertexes[0], function (key) {

resString1 += key + ' '

})

alert(resString1)

程序员灯塔

转载请注明原文链接:数据结构与算法学习——图论

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

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

相关文章

c语言式表白,c语言表白必备

c语言表白必备七夕情人节表白必备&#xff0c;多颜色心形展示看图#include#include#include#include #define r 10#define R 172int main(){int i;printf("我");fflush(stdout); //强制刷新缓存&#xff0c;输出显示Sleep(1000);printf("自");fflush(stdou…

android中gradle的作用,Gradle 之 Android 中的应用

在上一篇文章中 Gradle 之语言基础 Groovy 主要介绍了 Groovy 的基础语法(如果没有 Groovy 的基础&#xff0c;建议先看看上篇文章&#xff0c;如果可以动手敲一下里面的示例代码就更好不过了)&#xff0c;也是为本篇文章打基础的。本篇文章主要介绍 Gradle 在 Android 中的应用…

自己写的android apk反编译,获取Android自己写好了的apk以及反编译

今天&#xff0c;我们先说一下&#xff0c;获取Android自带的apk以及反编译它们来学习Android工程师是怎样写的&#xff0c;今天我们就以拿到Android自带的短信管理器的apk为例子你可能有疑问&#xff0c;为什么要那么麻烦&#xff0c;从系统来拿&#xff0c;还要反编译&#x…

一加7pro系统更新android10,一加OnePlus7T Pro官方安卓10.0稳定版出厂系统固件升级更新包...

咱们的这个一加OnePlus7T Pro手机的最新稳定版系统包也是在这里来分享一下了&#xff0c;这个稳定版本的系统包是安卓10稳定版的&#xff0c;也是第一个版本的&#xff0c;系统包大小是3.2G&#xff0c;系统方面主要是全新的UI设计&#xff0c;轻快流畅操作体验&#xff0c;更多…

5元素升级android6,升级你的app以支持高长宽比的新旗舰

为了呈现更好的视觉效果&#xff0c;许多安卓OEM厂商都开始采用超大屏幕。三星刚刚发布了自己的新旗舰Samsung Galaxy S8&#xff0c;长宽比达到18.5:9。今年早些时候的全球移动大会上LG也亮相了 LG G6&#xff0c;屏幕长宽比达到了18:9。(左) maximum aspect ratio为16:9的app…

CCS太阳光准直系统使用积分球均匀光源

CCS太阳光准直系统的应用范围广泛&#xff0c;包括太阳光辐射测量、光学遥感仪器研制与标定、均匀光源的推广使用等方面。通过使用CCS太阳光准直系统&#xff0c;可以准确地模拟太阳光&#xff0c;并对各种光学仪器进行校准和标定&#xff0c;从而提高测量精度和稳定性。 CCS太…

js怎么制作html的主题,用HTML和CSS以及JS制作简单的网页菜单界面的代码

写ABROAD项目用到了标签这个东东&#xff0c;其实标签在WEB上到处可见&#xff0c;图中就依次显示了DCC文章发布器、ABROAD后台添加数据、百度图片搜索、sf发布博客文章时贴标签的样式——标签就像浏览器里原生的checkbox一样&#xff0c;不过checkbox实在太丑了&#xff0c;就…

哔哩网站登录界面html代码,仿哔哩哔哩网页模板设计

【实例简介】【实例截图】【核心代码】bilibili├── Home.html├── Login.html├── Register.html├── css│ ├── bootstrap.min.css│ └── css.css├── forget the password.html├── img│ ├── 001.png│ ├── 002.png│ ├── 003.png│ …

2021高考成绩查询大连,2021年大连高考各高中成绩及本科升学率数据排名及分析...

一、大连高考各高中成绩及本科升学率数据2020年辽宁省普通高等学校招生文化课录取控制分数线普通类 文史特殊类型招生控制分数线&#xff1a;567分本科控制分数线&#xff1a;472分专科(高职、提前专科)控制分数线&#xff1a;150分普通类 理工特殊类型招生控制分数线&#x…

编写了html怎么测试,如何将测试结果写入HTMLTestRunner生成的报告标题中

HTMLTestRunner生成测试报告时&#xff0c;报告的标题在运行前就已经写死在代码了&#xff0c;假如我现在需要在执行完毕后&#xff0c;根据执行结果&#xff0c;把执行的状态写在标题里面&#xff0c;类似的效果如图&#xff1a;标题如果有一条执行错误的&#xff0c;就在后面…

编码 data text html c,谁说前端不需要懂二进制

作者&#xff1a;全栈成长之路 公号 / 山月行作为一名前端&#xff0c;在工作中也会遇到很多有关二进制处理的需求&#xff0c;如 EXCEL 表格的导出&#xff0c;PDF 的生成&#xff0c;多个文件的打包&#xff0c;音频的处理。从前后端整体上来说前端代表 UI 层&#xff0c;它的…

计算机联用测定无机盐溶解热测试题,计算机联用测定无机盐溶解热

计算机联用测定无机盐溶解热计算机联用测定无机盐溶解热一 实验目的1. 用量热计测定KCl的积分溶解热。2. 掌握量热实验中温差校正方法以及与计算机联用测量溶解过程动态曲线的方法。二 实验原理盐类的溶解过程通常包含着两个同时进行的过程&#xff1a;晶格的破坏和离子的溶剂化…

初中计算机考试用什么软件,初中信息技术《PowerPoint软件》考过啥

教师资格考试的试题中&#xff0c;不会缺少办公软件的身影&#xff0c;而办公软件作为最重要的文字处理工具&#xff0c;都考过哪些题目呢?该如何学习呢?中公教师给您指引方向。一、考题集锦1.PowerPoint中&#xff0c;为了让海龟按图1所示路线运动&#xff0c;应采用的方法是…

达内计算机毕业好找工作吗,大学生学什么好找工作 转行IT行业需要多久

6月毕业季&#xff0c;工作好找吗&#xff1f;9月招聘季&#xff0c;求职顺利吗&#xff1f;一直以来工作难找、人难招究竟难在哪&#xff1f;而另一边&#xff0c;企业求贤若渴&#xff0c;主动抢夺优秀人才&#xff01;却有很多毕业生抱怨求职难&#xff0c;找不到理想的工作…

ajax数据交互代码,Django中使用jquery的ajax进行数据交互的实例代码

jquery框架中提供了$.ajax、$.get、$.post方法&#xff0c;用于进行异步交互&#xff0c;由于Django中默认使用CSRF约束&#xff0c;推荐使用$.get示例&#xff1a;实现省市区的选择最终实现效果如图&#xff1a;将jquery文件拷贝到static/js/目录下打开booktest/views.py文件&…

MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结

文章目录前言一、连接到 MySQL 数据库1.1、连接到本机上的 MySQL1.2、连接到远程主机上的 MySQL二、退出 MySQL 命令三、修改 MySQL 密码3.1、先给 root 用户加个密码 ab123.2、再将 root 用户的密码改为 djg345四、增加新用户4.1、增加一个可以在任何主机上登录用户 test1&…

网站设计好怎么上传到服务器的,虚拟主机上传到网站的几个步骤

虚拟主机怎么上传到网站?站长们可以利用专业的软件协助自己上传&#xff0c;比如专业的ftp软件&#xff0c;具备支持续点相传&#xff0c;上传&#xff0c;以及下载目录等等&#xff0c;不会将限制过长的网站剔除&#xff0c;还可以下载列队&#xff0c;可以长传到本地&#x…

数据库管理工具:全网最全,MySQL 数据库图形化管理界面应用 Navicat Premium 使用教程

文章目录前言一、Navicat 下载和安装1.1、Navicat 下载1.2、Navicat 安装和启动二、创建数据库连接2.1、连接本地数据库2.2、连接远程数据库三、对数据库的“增删改查”功能操作3.1、对数据库的基本操作3.1.1、新建数据库3.1.2、删除数据库3.1.3、修改数据库3.1.4、查询数据库3…

电脑无线网络与服务器共享,图文详解win7笔记本如何实现内置无线局域网卡共享...

图文详解win7笔记本如何实现内置无线局域网卡共享&#xff1a;windows7集合了众多优点于一身&#xff0c;带来了空前的操作体验&#xff0c;同时还吸取了苹果Mac OS X系统的特色&#xff0c;因此很多用户在新购置笔记本电脑的时候都预装了win7系统&#xff0c;而且现在市面上出…

数据库深度剖析:Oracle、Microsoft SQL Server、MySQL 三者有何区别?

文章目录前言一、Oracle 数据库1.1、支撑平台范围广1.2、Oracle 在兼容性、可移植性、可联结性、高生产率上、开放性也存在优点1.3、Oracle 价格是比较昂贵的二、Microsoft SQL Server 数据库2.1、可伸缩性好、与相关软件集成程度高2.2、拥有良好的 ODBC 接口2.3、基于微软&…