图的学习

图的基本概念和术语

图的定义:图是由顶点的有穷非空集合和顶点之间的边的集合组成的,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;
}

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

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

相关文章

助阵央视春晚直播间,德施曼智能锁携手小红书“大家的春晚”玩转除夕夜

2月9日大年三十当天&#xff0c;智能锁行业领军品牌德施曼&#xff0c;将助阵小红书“央视春晚直播间”&#xff0c;参与“大家的春晚”活动&#xff0c;在直播间陪14亿观众一起看春晚&#xff0c;聊春晚&#xff0c;玩转除夕夜。 每年的央视春晚&#xff0c;都是亿万观众翘首…

前端工程\模块化

前端工程\模块化&#x1f3ed; 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2;&#xff0c;紧接前文&#xff1a;邂逅Node.JS的那一夜→博客 无论是前端、后端、甚至非编程领域都有模块化的概念&#xff0c;只是不同的领域叫法不同&#xff0c;不过&#xf…

Qt程序打包发布方法

步骤一 程序变成Release版本&#xff0c;编译一下 然后会生成后缀为.exe的文件 文件位置在x64/Release/ 下 步骤二 按下电脑的winR&#xff0c;输入cmd 点击确定进入如下界面 输入 cd 你的文件夹地址按下回车 如图所示 输入 windeployqt *.exe(*指的是你的文件名) &…

银行数据仓库体系实践(8)--主数据模型设计

主数据区域中保留了数据仓库的所有基础数据及历史数据&#xff0c;是数据仓库中最重要的数据区域之一&#xff0c;那主数据区域中主要分为近源模型区和整合&#xff08;主题&#xff09;模型区。上一节讲到了模型的设计流程如下图所示。那近源模型层的设计在第2.3和3这两个步骤…

聊聊 Http 服务化改造实践

在微服务架构体系中远程 RPC 调用主要包括 Dubbo 与 Http 调用两个大类&#xff0c;由于 Dubbo 拥有服务注册中心&#xff0c;并且起服务的命名非常规范&#xff0c;使用包名.类名.方法名进行描述。 粉丝福利&#xff0c; 免费领取C/C 开发学习资料包、技术视频/项目代码&#…

解读4篇混合类型文件Polyglot相关的论文

0. 引入 Polyglot文件指的是混合类型文件&#xff0c;关于混合类型文件的基础&#xff0c;请参考文末给出的第一个链接&#xff08;参考1&#xff09;。 1. Toward the Detection of Polyglot Files 1.1 主题 这篇2022年的论文&#xff0c;提出了Polyglot文件的检测方法。虽…

Vue-49、Vue技术实现动画效果

1、首先&#xff0c;在Vue项目中的src/components文件夹下创建一个名为AnimatedBox.vue的文件。 2、编辑AnimatedBox.vue文件&#xff0c;添加以下代码&#xff1a; <template><div class"animated-box" click"toggle"><transition name&q…

Python tkinter (12) —— Treeview控件

本文主要是Python tkinter Treeview控件介绍及使用简单示例。 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinte…

20240131在ubuntu20.04.6下使用whisper不同模式的比对

20240131在ubuntu20.04.6下使用whisper不同模式的比对 2024/1/31 16:07 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】 2、请正确安装好NVIDIA最新的驱动程序和CUDA。可选安装&#xff01; 3、配置whisper…

centOS+nodejs+mysql阿里云部署前后端个人网站

centOSnodejsmysql阿里云部署前后端个人网站 参考&#xff1a; 部署NodeExpressMySQL项目到阿里云轻量应用服务器 阿里云轻量应用服务器部署Node.jsReactMongoDB前后端分离项目 参考&#xff1a;在阿里云上部署nodejs服务 https 部署的原理就是你在本地测试的时候在地址栏&am…

npm淘宝镜像过期解决办法

npm淘宝镜像过期解决办法 因为npm 官方镜像&#xff08;registry.npmjs.org&#xff09;在国内访问很慢&#xff0c;我们基本上都会选择切换到国内的一些 npm 镜像&#xff08;淘宝镜像、腾讯云镜像等&#xff09;。由于淘宝原来的镜像&#xff08;registry.npm.taobao.org&am…

大创项目推荐 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…