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,一经查实,立即删除!

相关文章

MySQL 数据库事务实践

引言 在现代应用程序开发中&#xff0c;确保数据库操作的完整性和一致性至关重要。MySQL 提供了强大的事务管理功能&#xff0c;允许开发者以原子性、一致性、隔离性和持久性&#xff08;ACID&#xff09;的方式处理数据。本文将通过详细的解释和实际示例&#xff0c;带你深入…

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隔离级别 当前读…

js 函数定义域

1、1 let a 1;function fun () {console.log(a) }function fun1 () {let a 2;fun(); }fun1(); 2、2 let a 1;function fun1 () {let a 2;function fun () {console.log(a)}fun(); }fun1(); 3、2 let a 1;function fun1() {function fun() {console.log(a);}let a 2;…

羽毛球匹配项目实施清单

1. 数据库设计 1.1 数据库选型 数据库&#xff1a;MySQL理由&#xff1a;关系型数据库&#xff0c;支持复杂查询和事务处理&#xff0c;适合存储用户、匹配、聊天记录等结构化数据。 1.2 表结构设计 1.2.1 用户表&#xff08;users&#xff09; 字段名 类型 描述 id BI…

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

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

vue3中的v-model如何自定义修饰符

子组件封装 <script setup lang"ts"> import { defineModel } from "vue"const firstName defineModel("first-name") // 自定义组件修饰符&#xff0c;首字母大写 const [lastName, lastNameModifiers] defineModel("last-name&q…

Mac系统Android sdk的安装

在macOS系统上安装Android SDK,通常可以通过安装Android Studio来实现,因为Android Studio默认包含了Android SDK。以下是详细的安装步骤: 一、下载并安装Android Studio 访问官网:首先,打开浏览器,访问Android Studio官方网站的下载页面。下载Android Studio:点击“Do…

Vue的常用修饰符

1.事件修饰符 stop&#xff1a;阻止事件冒泡&#xff0c;相当于调用 event.stopPropagation()。 prevent&#xff1a;阻止事件的默认行为&#xff0c;相当于调用 event.preventDefault()。 capture&#xff1a;使用事件捕获模式&#xff0c;即从最外层开始触发事件。 self&…

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

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

使用Python实现手写数字识别

引言: 手写数字识别是“光学字符识别技术”(简称OCR)的一个分支,它研究的对象是:如何利用电子计算机自动辨认人手写在纸张上的阿拉伯数字。 在整个OCR领域中,最为困难的就是脱机手写字符的识别。到目前为止,尽管人们在脱机手写英文、汉字识别的研究中已取得很多可喜成就…

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

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

深入详解线性代数基础知识:理解矩阵与向量运算、特征值与特征向量,以及矩阵分解方法(如奇异值分解SVD和主成分分析PCA)在人工智能中的应用

深入详解线性代数基础知识在人工智能中的应用 线性代数是人工智能&#xff0c;尤其是机器学习和深度学习领域的基石。深入理解矩阵与向量运算、特征值与特征向量&#xff0c;以及矩阵分解方法&#xff08;如奇异值分解SVD和主成分分析PCA&#xff09;&#xff0c;对于数据降维、…

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

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

Reactor 响应式编程(第三篇:R2DBC)

系列文章目录 Reactor 响应式编程&#xff08;第一篇&#xff1a;Reactor核心&#xff09; Reactor 响应式编程&#xff08;第二篇&#xff1a;Spring Webflux&#xff09; Reactor 响应式编程&#xff08;第三篇&#xff1a;R2DBC&#xff09; Reactor 响应式编程&#xff08…