12.11数据结构-图

无向完全图:在无向图中,如果任意两个顶点之间都存在则称该图为无向完全图。

向完全图:在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。  af8170eeab53401d91a287984482361b.png

含有n个顶点的无向完全图有n×(n-1)/2条边。

含有n个顶点的有向完全图有n×(n-1)条边。

 

顶点的度:无向图中,顶点v是指依附于该顶点的边数,通常记为TD (v)。

顶点的入度:有向图中,顶点v入度是指以该顶点为弧头的弧的数目,记为ID (v)

顶点出度:有向图中,顶点v出度是指以该顶点为弧尾的弧的数目,记为OD (v)

 

 

在具有n个顶点、e条边的无向图G中,各顶点的度之和与边数之和的关系:
 

9d8650035e474deda5cf215f15c3e32e.png

在具有n个顶点、e条边的有向图G中,各顶点的入度之和与各顶点的出度之和的关系?与边数之和的关系:

f08ffb28b23b49d2a57da44a196a5dda.png

 

回路(环):第一个顶点和最后一个顶点相同的路径。

简单路径:序列中顶点不重复出现的路径。

简单回路(简单环):除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路。

 

子图:若图G=(VE),G'=(V'E'),如果: V'ÍV E' Í E则称图G'G的子图。

894f5474863b44858fef16cb3c48ad4e.png

 

连通图:在无向图中,如果从一个顶点vi到另一个顶点vj(ij)有路径,则称顶点vivj是连通的。如果图中任意两个顶点都是连通的,则称该图是连通图。

连通分量:非连通图的极大连通子图称为连通分量。

 

一个n个顶点的连通无向图,其边的个数至少为( n-1   )

因为它如果是个树的话,边就最少了

 

 

连通(Connected)

  • 无向图中的连通:在无向图中,如果任意两个顶点之间存在一条路径,那么这个图就是连通的。即从一个顶点出发,可以通过边访问到任何其他顶点。

  • 有向图中的连通:在有向图中,如果从任意两个顶点中的一个可以通过有向边到达另一个,那么这两个顶点是连通的。但需要注意,这并不意味着整个图是连通的,仅是针对特定的顶点。

强连通(Strongly Connected)

  • 有向图中的强连通:在有向图中,如果图中的每一对顶点  都能相互到达,那么这个图是强连通的。强连通要求顶点之间的路径是双向的。

  • 对于无向图,强连通的概念并不适用,因为无向图的每条边本身就是双向的,通常直接称为“连通”。

总结

  • 连通:在无向图中,任意两个顶点都有路径相连;在有向图中,特定的两个顶点之间有一条路径。
  • 强连通:仅适用于有向图,表示任意两个顶点之间既可以从一个到达另一个,也可以从另一个到达前者。

要连通具有n个顶点的有向图,至少需要(   n-1 )条边。

只要连通就行,不用强连通。所以画个单边的树就行

 

131e795ae34e4477a02465dcdf087026.png

由握手定理知A正确,

在无向图中,握手定理表述为:所有顶点的度数之和等于边数的 2 倍。

通俗来讲,假如把图中的顶点看成是人,边看成是两个人握手,那么每个人握手的次数(即顶点的度数)加起来,就等于总的握手次数的 2 倍,因为每一条边(一次握手)会在两个顶点(两个人)的度数中各被计算一次。

BC错误,画个单边树,得到b错误,画个三角形得到c错误。

 

图的遍历

① 在图中,如何选取遍历的起始顶点?

中,任何两个顶点之间都可能存在边,顶点是没有确定的先后次序的,所以,顶点的编号不唯一。为了定义操作的方便,将图中的顶点按任意顺序排列起来,比如,按顶点的存储顺序。然后选取下标小的顶点

② 从某个起点始可能到达不了所有其它顶点怎么办?

解决方案:多次调用从某顶点出发遍历图的算法。

 

③ 因图中可能存在回路,某些顶点可能会被重复访问,那么如何避免遍历不会因回路而陷入死循环?

解决方案:附设访问标志数组visited[n]

④ 在图中,一个顶点可以和其它多个顶点相连,当这样的顶点访问过后,如何选取下一个要访问的顶点?

解决方案:深度优先遍历和广度优先遍历。

邻接矩阵的DFS和BFS:

#include<iostream>
using namespace std;
int visited[10] = { 0 };class MGraph
{
public:MGraph(char a[], int n, int e);~MGraph() {};void DFS(int v);void BFS(int v);
private:char vertex[10];int edge[10][10];int vertexNum, edgeNum;};MGraph::MGraph(char a[], int n, int e)
{int i, j, k;vertexNum = n;edgeNum = e;for (i = 0; i < vertexNum; i++)vertex[i] = a[i];for (i = 0; i < vertexNum; i++)for (j = 0; j < vertexNum; j++)edge[i][j] = 0;for (k = 0; k < edgeNum; k++){cin >> i >> j;edge[i][j] = 1;edge[j][i] = 1;}
}void MGraph::DFS(int v)
{int  j;cout << vertex[v];visited[v] = 1;for(j =0;j<vertexNum;j++)if (edge[v][j] == 1 && visited[j] == 0)DFS(j);
}void MGraph::BFS(int v)
{cout << vertex[v];visited[v] = 1;int w, j, Q[10];int front = -1, rear = -1;Q[++rear] = v;while (front != rear){w = Q[++front];for(j = 0;j<vertexNum;j++)if (edge[w][j] == 1 && visited[j] == 0){cout << vertex[j];visited[j] = 1;Q[++rear] = j;}}
}int main()
{int i;char ch[] = { 'A','B','C','D','E' };MGraph MG(ch, 5, 6);for (i = 0; i < 10; i++)visited[i] = 0;cout << "深搜:" << endl;MG.DFS(0);for (i = 0; i < 10; i++)visited[i] = 0;cout << endl;cout << "广搜" << endl;MG.BFS(0);
}

邻接表:

#include<iostream>
using namespace std;
int visited[10] = { 0 };struct EdgeNode
{int adjvex;EdgeNode* next;
};struct VertexNode
{char vertex;EdgeNode* firstEdge;
};class ALGraph
{
public:ALGraph(char a[], int n, int e);~ALGraph() ;void DFS(int v);void BFS(int v);
private:VertexNode adjlist[10];int vertexNum, edgeNum;
};ALGraph::ALGraph(char a[], int n, int e)
{int i, j, k;EdgeNode* s = nullptr;vertexNum = n;edgeNum = e;for (i = 0; i < vertexNum; i++){adjlist[i].vertex = a[i];adjlist[i].firstEdge = nullptr;}for (k = 0; k < edgeNum; k++){cin >> i >> j;s = new EdgeNode;s->adjvex = j;s->next = adjlist[i].firstEdge;adjlist[i].firstEdge = s;}
}ALGraph::~ALGraph()
{EdgeNode* p = nullptr, * q = nullptr;for (int i = 0; i < vertexNum; i++){p = q = adjlist[i].firstEdge;while (p != nullptr){p = p->next;delete q;q = p;}}
}void ALGraph::DFS(int v)
{int j;EdgeNode* p = nullptr;cout << adjlist[v].vertex;visited[v] = 1;p = adjlist[v].firstEdge;while (p != nullptr){j = p->adjvex;if (visited[j] == 0)DFS(j);p = p->next;}
}void ALGraph::BFS(int v)
{int w, j, Q[10];int front = -1, rear = -1;EdgeNode* p = nullptr;cout << adjlist[v].vertex;visited[v] = 1;Q[++rear] = v;while (front != rear){w = Q[++front];p = adjlist[w].firstEdge;while (p != nullptr){j = p->adjvex;if (visited[j] == 0){cout << adjlist[j].vertex;visited[j] = 1;Q[++rear] = j;}p = p->next;}}
}int main()
{int i;char ch[] = { 'A','B','C','D','E' };ALGraph ALG(ch, 5, 6);ALG.DFS(0);for (i = 0; i < 10; i++)visited[i] = 0;cout << endl;ALG.BFS(0);
}

 

 

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

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

相关文章

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址&#xff1a;https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64&#xff0c;一直下一步&#xff0c;选择安装的路径位置&#xff0c;一直下一步就安装完成了。打开Anaconda PowerShell Promp…

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉&#xff0c;我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录&#xff0c;你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…

java全栈day16--Web后端实战(数据库)

一、数据库介绍 二、Mysql安装&#xff08;自行在网上找&#xff0c;教程简单&#xff09; 安装好了进行Mysql连接 连接语法&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroot -p密码 方法二&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroo…

CORDIC 算法实现 _FPGA

注&#xff1a;本文为 “CORDIC 算法” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 Cordic 算法的原理介绍 乐富道 2014-01-28 23:05 Cordic 算法知道正弦和余弦值&#xff0c;求反正切&#xff0c;即角度。 采用用不断的旋转求出对应的正弦余弦值&…

前端(vue组件)

1组件对象 1.1定义组件对象 defineComponent( {} ) 1.2注册组件 1.3使用组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

MySQL八股-MVCC入门

文章目录 当前读&#xff08;加锁&#xff09;快照读&#xff08;不加锁&#xff09;MVCC隐藏字段undo-log版本链A. 第一步B.第二步C. 第三步 readview MVCC原理分析RCA. 先来看第一次快照读具体的读取过程&#xff1a;B. 再来看第二次快照读具体的读取过程: RR隔离级别 当前读…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

从 CephFS 到 JuiceFS:同程旅游亿级文件存储平台构建之路

随着公司业务的快速发展&#xff0c;同程旅行的非结构化的数据突破 10 亿&#xff0c;在 2022 年&#xff0c;同程首先完成了对象存储服务的建设。当时&#xff0c;分布式文件系统方面&#xff0c;同程使用的是 CephFS&#xff0c;随着数据量的持续增长&#xff0c;CephFS 的高…

Jenkins参数化构建详解(This project is parameterized)

本文详细介绍了Jenkins中不同类型的参数化构建方法&#xff0c;包括字符串、选项、多行文本、布尔值和git分支参数的配置&#xff0c;以及如何使用ActiveChoiceParameter实现动态获取参数选项。通过示例展示了传统方法和声明式pipeline的语法 文章目录 1. Jenkins的参数化构建1…

【图像处理】利用numpy实现直方图均衡、自适应直方图均衡、对比度受限自适应直方图均衡

直方图均衡化是一种在图像处理技术&#xff0c;通过调整图像的直方图来增强图像的对比度。 本博客不利用opencv库&#xff0c;仅利用numpy、matplotlib来实现直方图均衡、自适应直方图均衡、对比度受限自适应直方图均衡 直方图均衡 包括四个流程 计算图像RGB三通道的归一化直…

组织空转数据(人类+小鼠)

空间转录组&#xff08;Spatial Transcriptomics&#xff09;是一种新兴的高通量基因组学技术&#xff0c;它允许我们在组织切片中同时获取基因表达信息和细胞的空间位置信息。其可以帮助我们更好地理解细胞在组织中的空间分布和相互作用&#xff0c;揭示组织发育、器官功能和疾…

[数据结构#1] 并查集 | FindRoot | Union | 优化 | 应用

目录 1. 并查集原理 问题背景 名称与编号映射 数据结构设计 2. 并查集基本操作 (1) 初始化 (2) 查询根节点 (FindRoot) (3) 合并集合 (Union) (4) 集合操作总结 并查集优化 (1) 路径压缩 (2) 按秩合并 3. 并查集的应用 (1) 统计省份数量 (2) 判断等式方程是否成…

JPA 基本查询(一)

JPA 查询简介示例 JPA教程 - JPA查询简介示例 最简单的JPQL查询选择单个实体类型的所有实例。 考虑下面的查询: SELECT e FROM Employee eJPQL尽可能使用SQL语法。 SQL查询从表中选择。JPQL从应用程序域模型的实体中选择。 语法 选择查询的整体形式如下: SELECT <sel…

【操作系统1】一篇文章便可入门操作系统

操作系统 (Operating System,OS)是一种系统软件&#xff0c;它负责管理计算机的硬件和软件资源。它的主要任务是组织和调度计算机的工作&#xff0c;并分配资源给用户和其他软件。操作系统为用户和软件提供了方便的接口和环境。它是计算机系统中最基本的软件之一。 一、操作系…

μC/OS-Ⅱ源码学习(6)---事件标志组

快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 本文进一步解析事件模型中&#xff0c;事件标志…

【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)

问题描述 根据操作手册正常拉取代码&#xff0c;然后编译OpenHarmony5.0.0版本rk3568项目 编译命令 ./build.sh --product-name rk3568 --ccache出现如下报错 然后真正开始出错的位置是下面这句log FAILED: ../kernel/src_tmp/linux-5.10/boot_linux ../kernel/checkpoint/c…

C++重点和练习-----多态

rpg.cpp: #include <iostream>using namespace std;/*模拟一个游戏场景有一个英雄&#xff1a;初始所有属性为1atk,def,apd,hp游戏当中有以下3种武器长剑Sword&#xff1a; 装备该武器获得 1atx&#xff0c;1def短剑Blade&#xff1a; 装备该武器获得 1atk&#xff0c;1…

Qt之点击鼠标右键创建菜单栏使用(六)

Qt开发 系列文章 - menu&#xff08;六&#xff09; 目录 前言 一、示例演示 二、菜单栏 1.MenuBar 2.Menu 总结 前言 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、一个状态栏(status…

天猫魔盒M17/M17S_超级UI 线刷固件包-可救砖(刷机取消双勾)

在智能电视盒子的领域中&#xff0c;天猫魔盒 M17 以其独特魅力占据一席之地&#xff0c;然而&#xff0c;原厂设置有时难以满足进阶用户的多元需求。此刻&#xff0c;刷机成为开启全新体验的关键钥匙&#xff0c;为您的盒子注入鲜活能量。 一、卓越固件特性概览 此款精心打造的…