七桥问题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…

《c#编程语言详解》,C#编程语言详解(第2版)

前言前 言C#项目启动于七年前——1998年12月&#xff0c;其目标是为全新的并命名为.NET的平台创建一种简单、现代、面向对象和类型安全的程序设计语言。从那时起&#xff0c;C#已经走过了漫长的道路。现在&#xff0c;成千上万的程序员在使用C#语言&#xff1b;ECMA和ISO/IEC已…

明解c语言中级篇微盘,明解C语言:中级篇

第1章 猜数游戏  11-1 猜数判定  2通过if语句实现条件分支  2if语句的嵌套  3实现多分支的方法  41-2 重复到猜对为止  8通过do语句循环  8相等运算符和关系运算符  9通过while语句循环  10break语句  10while语句和do语句  11先判断后循环和先循环后…

共同体不是c语言中的一个数据类型,《c语言程序设计教学资料》第12章---构体和共同体.ppt...

《c语言程序设计教学资料》第12章---构体和共同体向函数传递结构体 用结构体指针或结构体数组作为函数参数&#xff0c;向函数传递结构体的地址 按值调用 按地址调用 结构体变量作函数参数 实现按值调用 结构体指针作函数参数 从函数返回 结构体变量的值 共用体 共用体所占内存…

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

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

android程序更改pdf文件格式,Android根据pdf模板生成pdf文件

1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat 3 new android.icu.text.SimpleDateFormat("HHmmss");//HH:mm:ss4 //设置默认时区5 simpleDateFormat.setTimeZone(android.icu.util.TimeZone.getTimeZone("G…

android页面跳转时获取地址栏,Android 利用scheme页面内跳转协议进行跳转

什么是 URL Scheme&#xff1f;android中的scheme是一种页面内跳转协议。通过定义自己的scheme协议&#xff0c;可以非常方便跳转app中的各个页面&#xff1b;通过scheme协议&#xff0c;服务器可以定制化告诉App跳转到APP内部页面。之前项目都是我们客户端和服务器端用自定义j…

android按钮置于顶层,如何把按键显示在最顶层窗口上(屏幕最顶上)

[Delphi] 纯文本查看 复制代码unit Unit2;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;typeTForm2 class(TForm)procedure FormCreate(Sender: TObject);private{ …

android signalr 自动重连,.net-何时在signalR中重新连接?

当客户端脱机然后不久后重新获得连接时&#xff0c;就会发生集线器重新连接。 SignalR配置值在很大程度上决定了以下示例的时间戳&#xff0c;因此无需逐字记录时间。以下是一些示例及其涉及重新连接行为的结果(时间格式&#xff1a;m&#xff1a;ss)&#xff1a;当我提到以下内…

自己写的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,HTML+CSS系列:登录界面实现

font-face{font-family:"iconfont";src:url(iconfont.eot?t1601708272399); /*IE9*/src:url(iconfont.eot?t1601708272399#iefix) format(embedded-opentype),/*IE6-IE8*/url(data:application/x-font-woff2;charsetutf-8;base64,d09GMgABAAAAAARUAAsAAAAACIAAAAQI…

html文档基本结构由哪三对,第3章 网页制作及HTML语言基本结构简介.ppt

第三章 网页制作与HTML语言基本结构简介 本章提要 静态网页与动态网页 Dreamweaver MX制作网页 HTML语言的基本结构 3.1网页制作概述 3.1.1静态网页与动态网页 1.静态网页 由超级文本标志语言HTML的标志代码构成&#xff1b; 用记事本、FrontPage、Dreamweaver、Fireworks可以制…

哔哩网站登录界面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;就在后面…

计算机基本的应用是,计算机统考应用基础练习题

计算机统考应用基础练习题计算机统考就要来临&#xff0c;有哪些好的练习试题。下面是小编为您整理的关于计算机统考应用基础练习题的相关资料&#xff0c;欢迎阅读&#xff01;计算机安全的基本知识和概念1、下面最难防范的网络攻击是______。A、计算机病毒B、假冒C、修改数据…