当前位置: 首页 > news >正文

图的学习

图的基本概念和术语

图的定义:图是由顶点的有穷非空集合和顶点之间的边的集合组成的,G表示,V是图G中顶点的集合,E是图G中边的集合

无向图:任意两点的边都是无向边组成的图(无向边:(A,B)表示点A能到点B,点B也能到点A)

有向图:任意两点的弧都是有向边组成的图(有向边:<A,B>表示点A能到点B,点B不能到点A(B为弧头,A为弧尾)

边较少的图叫稀疏图,反之叫稠密图

权,网:图的边或弧相关的数叫权,这种带权的图通常叫做网

顶点的度:无向图中顶点的度表示和顶点相关联的的边的数目(记TD);有向图中分为入度和出度

 入度为顶点为弧头有关联的弧,出度为顶点为弧尾有关联的弧

路径长度:路径长度是路径上边或弧的数目

回路,环:第一个顶点和最后一个顶点相同的路径称为回路或环

连通图:图中任意两点都是连接的(有路径),有向图中称为强连通图

无向图中联通n个顶点和n-1条边叫生成树,有向图中一顶点入度为0其余顶点入度为1的叫有向树。

 

 

 图的储存结构

邻接矩阵

图的邻接矩阵采用顺序存储结构,用一个一维数组储存顶点的信息,一个二维数组储存图中边或弧的的信息

优点:便于理解,适合稠密图,O(1)判断两点是否有边,删除边比较方便

缺点:遇到边较少的图,浪费大量空间,图的建立,dfs,bfs遍历时间复杂度较高为O(N^2),删除点不方便

 邻接表

邻接表采用顺序+链式存储结构,一个一维结构体数组(数组大小为结点数量),结构体数组的存储元素构成单链表,每一个单链表链接与该结点相连的点

 优点:根据需求分配空间,浪费的空间较少,适合稀疏图

 缺点:删除边或点比较麻烦,对于有向图不利于求某个点出度的数量

 

 图的遍历

广度优先遍历和深度优先遍历,对于邻接矩阵和邻接表的时间复杂度都为平方阶和线性阶

 所以对于有关于图的遍历问题一般采用邻接表储存图,时间开销更小

图中如果不是联通图,存在一次遍历不能遍历全部的点,一般用数组标记判断点是否遍历

 模板题 洛谷 P5318 查找文献

本题考察图的深度和广度

题目描述

小 K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小 K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。

假设洛谷博客里面一共有n(n≤10^5) 篇文章(编号为 1 到 n)以及 m(m≤10^6) 条参考文献引用关系。目前小 K 已经打开了编号为 1 的一篇文章,请帮助小 K 设计一种方法,使小 K 可以不重复、不遗漏的看完所有他能看到的文章。

这边是已经整理好的参考文献关系图,其中,文献 X → Y 表示文章 X 有参考文献 Y。不保证编号为 1 的文章没有被其他文章引用。

请对这个图分别进行 DFS 和 BFS,并输出遍历结果。如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序)。

输入格式

共 m+1 行,第 1 行为 2 个数,n 和 m,分别表示一共有 n(n≤10^5) 篇文章(编号为 1 到 n)以及m(m≤10^6) 条参考文献引用关系。

接下来 m 行,每行有两个整数 X,Y 表示文章 X 有参考文献 Y。

输出格式

共 2 行。 第一行为 DFS 遍历结果,第二行为 BFS 遍历结果。

输入输出样例

输入 #1

8 9
1 2
1 3
1 4
2 5
2 6
3 7
4 7
4 8
7 8

输出 #1

1 2 5 6 3 7 8 4 
1 2 3 4 5 6 7 8 

 看题发现本题的n的范围10^5用邻接矩阵不仅空间存不下,遍历也浪费时间,所以采用邻接表

这题不需要考虑是否为连通图,题目的数据,若是存在一个点与1号点没有联系则不需要输出这个点

思路

我们知道邻接表遍历结果不唯一的,而题目要求请先看编号较小的那篇(因此你可能需要先排序),链表不好进行排序,我们可以先对输入的m个x和y进行排序,因为对于邻接表一般采用头插法(先插入的点在链表的最后),按照y的比较进行降序排列,这样可以保证每一个单链表都是升序。

AC代码

#include<stdio.h>
#include<stdlib.h>
struct nb {int data;struct nb* p;
}a[100010];//邻接表
struct mm {int l, r;
}mr[1000010], b[1000010];//b为归并辅助数组
void guibin(int x, int y)//归并排序不多说
{if (x >= y) return;long long mid = (x + y) / 2, i, j;guibin(x, mid);guibin(mid + 1, y);int cnt = 0;for (i = x, j = mid + 1; i <= mid && j <= y;){if (mr[i].r >= mr[j].r)b[++cnt] = mr[i++];elseb[++cnt] = mr[j++];}while (i <= mid)b[++cnt] = mr[i++];while (j <= y)b[++cnt] = mr[j++];for (i = 1; i <= cnt; i++)mr[x + i - 1] = b[i];
}
int book[100010], book1[100010] = { 0 };//标记数组
void dfs(int  x)
{struct nb* gg;book[x] = 1;//第一次访问标记为1printf("%d ", x);//打印结果gg = a[x].p;while (gg){if (book[gg->data] == 0)//第一次访问dfs搜索dfs(gg->data);gg = gg->p;}
}
void bfs(int x)
{int link[100010];int hard = 1, tail = 2;link[1] = x; book1[x] = 1;while (hard < tail){printf("%d ", link[hard]);struct nb* f = a[link[hard]].p;while (f != NULL){if (book1[f->data] == 0){link[tail++] = f->data;book1[f->data] = 1;}f = f->p;}hard++;}
}
int main()
{int n, m, i, j;struct nb* q, * t, * s;scanf("%d %d", &n, &m);for (i = 1; i <= m; i++)//输入m个x,yscanf("%d %d", &mr[i].l, &mr[i].r);for (i = 1; i <= n; i++)a[i].p = NULL;guibin(1, m);//降序排序for (i = 1; i <= m; i++)//邻接表的建立{q = (struct nb*)malloc(sizeof(struct nb));q->data = mr[i].r; q->p = a[mr[i].l].p;a[mr[i].l].p = q;}dfs(1);//dfs搜索printf("\n");bfs(1);//bfs搜索for (i = 1; i <= n; i++)//清空邻接表链表,避免内存泄露{s = a[i].p;while (s != NULL){t = s;s = s->p;free(t);}}return 0;
}

相关文章:

图的学习

图的基本概念和术语 图的定义&#xff1a;图是由顶点的有穷非空集合和顶点之间的边的集合组成的&#xff0c;G表示&#xff0c;V是图G中顶点的集合&#xff0c;E是图G中边的集合 无向图&#xff1a;任意两点的边都是无向边组成的图&#xff08;无向边&#xff1a;&#xff08…...

空间数据分析入门POI与莫兰指数基础知识笔记

1. 空间分析与POI 1.1. 什么是POI POI是“Polnt of Information”的缩写&#xff0c;中文可以翻译为“信息点”。POI是地图上任何非地理意义的有意义的点&#xff0c;如商店、酒吧、加油站、医院、车站等。这些点通常包括名称、类别、经纬度和地址等基本信息。此外&#xff0…...

TortoiseSVN各版本汉化包下载

首先进入下载版本列表 1.下载地址&#xff1a;https://sourceforge.net/projects/tortoisesvn/files ​ 2.选择自己版本进入​ 3.选择Language Packs进入&#xff0c;选择对应语言包下载。 ​ 4.在TortoiseSVN根目录下点击安装即可。 ​...

STM32连接阿里云物联网平台

文章目录 引言一、STM32连接阿里云物联网平台思路二、ESP8266烧录固件三、使用AT指令连接阿里云物联网平台四、STM32环形串口缓冲区驱动程序五、STM32连接阿里云驱动程序 引言 连续写了两篇关于阿里云连接的文章&#xff0c;都是使用Arduino ESP8266 & Arduino ESP32的方式…...

力扣hot100 组合总和 回溯 剪枝 组合

Problem: 39. 组合总和 文章目录 思路复杂度&#x1f496; Code 思路 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f496; Code class Solution{List<List<Integer>> res new ArrayList<>();int x;// 全局targetin…...

代码随想录 Leetcode669. 修剪二叉搜索树

题目&#xff1a; 代码(首刷看解析 2024年1月31日&#xff09;&#xff1a; class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (!root) return root;if (root->val < low) {TreeNode* node trimBST(root->right,low,high);return…...

Redis系列-数据结构篇

数据结构 string&#xff08;字符串&#xff09; redis的字符串是动态字符串&#xff0c;类似于ArrayList&#xff0c;采用预分配冗余空间的方式减少内存的频繁分配。 struct SDS<T>{ T capacity; T len; byte flags; byte[] content; } 当字符串比较短时&#xff0c…...

正则表达式(RE)

什么是正则表达式 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;。正则表达式通常被用来检索、替换那些符合某个规则的文本 正则表达式的作用 验证数据的有效性替换文本内容从字符串中提取子字符串 匹配单个字符 字符功能.匹配任意1个…...

发布技术路线图!美国量子计算公司QuEra公开三年OKR

​编辑丨慕一 编译/排版丨琳梦 卉可 深度好文&#xff1a;1100字丨8分钟阅读 近期&#xff0c;美国量子计算公司QuEra Computing宣布了一系列关于容错量子计算机的战略路线图&#xff0c;该路线图从2024年开始&#xff0c;最终目标是打造具有100纠错逻辑量子比特的系统。 在…...

Vue2:请求接口的两种方式axios和vue-resource

一、场景描述 前端和后端的交互&#xff0c;肯定是要发生接口调用的 这个时候&#xff0c;就要涉及前端如何向后端接口发送请求&#xff0c;获取数据 二、请求方式 1、axios方式(推荐) 这个方式本质就是ajax&#xff0c;底层就是对xhr(XMLHttpRequest)的封装 1、安装axios…...

扩展学习|商业智能和大数据分析的研究前景(比对分析)

文献来源&#xff1a; Liang T P , Liu Y H .Research Landscape of Business Intelligence and Big Data analytics: A bibliometrics study[J].Expert Systems with Applications, 2018, 111(NOV.):2-10.DOI:10.1016/j.eswa.2018.05.018. 信息和通信技术的快速发展导致了数字…...

『Docker入门指南』- 详细安装与配置教程,助你起航容器化世界!

引言 在探索云计算和自动化部署的时代&#xff0c;Docker以其独特的容器化技术站在了风口浪尖。如果你期待着无缝地将你的应用从一个环境迁移到另一个环境&#xff0c;那么Docker无疑是你的得力助手。但首先&#xff0c;我们得学会如何正确地安装和配置Docker。这篇文章将详细…...

如何提高http连接成功率?

问题 丢包、错包、乱包 高延迟 响应数据回来时间长&#xff0c;甚至大于客户端等待时间 带宽小 每次能够通信的内容较少&#xff0c;数据包越大受影响可能越大 网络断续 网络经常断开又连接 优化处理 采用TCP协议、实现长连接&#xff0c;采用长连接池&#xff0c;节省…...

Elasticsearch 中使用MustNot等同于不等于遇到的坑

1、在写关键词推荐时,需要把当前文章过滤掉,不能再推荐自己的文章,所以再es中需要用到 MustNot属性查询 /// <summary> /// 服务中心es检索 /// </summary> /// <param name="input"></param> /// <returns></…...

嵌入式工程师day15(链表)

内存管理 一.内存管理: 1.malloc void *malloc(size_t size); 功能: 申请堆区空间 参数: size:申请堆区空间的大小 返回值: 返回获得的空间的首地址 失败返回NULL 2.free void free(void *ptr); 功能: 释放…...

Coppeliasim倒立摆demo

首先需要将使用Python远程控制的文件导入到文件夹&#xff0c;核心是深蓝色的三个文件。 本版本为4.70&#xff0c;其文件所在位置如下图所示&#xff0c;需要注意的是&#xff0c;目前不支持Ubuntu22的远程api&#xff1a; 双击Sphere这一行的灰色文件&#xff0c;可以看到远程…...

汽车燃油泵数据分析:全球市场的年复合增长率将达到10%左右

燃油泵是汽车配件行业的专业术语。是电喷汽车燃油喷射系统的基本组成之一&#xff0c;位于车辆油箱内部&#xff0c;燃油泵在启动和发动机运转时工作&#xff0c;如果发动机停止而点火开关仍处于ON时&#xff0c;HFM-SFI控制模块关闭燃油泵的电源&#xff0c;以避免意外点火。 …...

DC-磁盘管理(23国赛真题)

2023全国职业院校技能大赛网络系统管理赛项–模块B:服务部署(WindowServer2022) 文章目录 题目配置步骤组成RAID 5,磁盘分区命名为卷标H盘:Raid5。手动测试破坏一块磁盘,做RAID磁盘修复,确认RAID 5配置完毕。验证查看Raid5(打开磁盘管理器,查看raid信息)Raid5磁盘修复…...

216961-98-7,BODIPY 493/503 NHS 活化酯,可以应用于分子生物学等领域中

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;216961-98-7&#xff0c;BODIPY 493/503 NHS 活化酯&#xff0c;BODIPY 493/503 NHS ester&#xff0c;BODIPY 493/503 SE 一、基本信息 产品简介&#xff1a;BODIPY 493/503 NHS ester是一种特殊的染料&#xff0c…...

Python采集学习笔记-读取excel数据

表格格式 方法一:使用xlrd import xlrd 1.读取Excel文件 workbook xlrd.open_workbook(plc.xlsx) 2.读取第一个表 sheet workbook.sheet_by_index(0) 3.获取表格总行数 total_rows sheet.nrows 4.创建列表,存储表格一行中每一列信息 plc_info [] for row in range(1…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...