「数据结构详解·九」图的初步

news2024/11/20 2:45:20
  • 「数据结构详解·一」树的初步
  • 「数据结构详解·二」二叉树的初步
  • 「数据结构详解·三」栈
  • 「数据结构详解·四」队列
  • 「数据结构详解·五」链表
  • 「数据结构详解·六」哈希表
  • 「数据结构详解·七」并查集的初步
  • 「数据结构详解·八」带权并查集 & 扩展域并查集
  • 「数据结构详解·九」图的初步

注意:本章主要讲解图的存储图的遍历

1. 图的定义、构成和术语

图(Graph),我们可以把它定义成一个二元组 G = ( V , E ) G=(V,E) G=(V,E)。其中 V V V 代表 Vertices Set \text{Vertices Set} Vertices Set,即顶集,顶集中的元素称为顶点(Vertex),写作 V ( G ) V(G) V(G) E E E 代表 Edges Set \text{Edges Set} Edges Set,即边集,边集中的元素称为边(Edge),写作 E ( G ) E(G) E(G) V , E V,E V,E 无交集 E E E 中的元素也是二元组,为 ( x , y ) (x,y) (x,y),且 x , y ∈ V x,y\in V x,yV

图还有一种三元组的定义,这里不再赘述,感兴趣的读者可以自行查阅。

以上定义可能较为形式化,较难理解。读者一会可以通过下面的例子来理解。

图还分为有向图无向图——也就是说,有向图的边有方向,即有向边,无向图的边无方向,即无向边。特殊地,如果一个图的边带有权值,则称为带权图
以下分别展示了有向图、无向图、无向带权图。同时我会用形式语言、通俗语言和举例来帮助大家更好理解。
有向图
无向图
无向带权图

  • G G G点集 V V V 的大小,称作图 G G G阶(Order)
    一个图中顶点的个数,就是一个图的阶。
    1 ∼ 3 1\sim 3 13 的阶都是 6 6 6
  • 当存在图 G ′ = ( V ′ , E ′ ) G'=(V',E') G=(V,E)其中 V ′ ∈ V , E ′ ∈ E V'\in V,E'\in E VVEE,则 G ′ G' G 称作图 G = ( V , E ) G=(V,E) G=(V,E)子图(Sub-Graph)
    从一个图中“抠”下来的图(即两个图具有包含关系),则被包含的图是另一个图的子图。
    1 ∼ 3 1\sim 3 13 分别都是各自的子图。
  • 当存在图 G ′ G' G 是图 G G G子图,且 V ( G ′ ) = V ( G ) V(G')=V(G) V(G)=V(G),则称为图 G ′ G' G 是图 G G G生成子图(Spanning Sub-Graph)
    一个图是另一个图的子图,且这两个图顶点数相同,则这个子图是另一个图的生成子图。
    1 1 1 中,若去掉了 1 → 5 , 1 → 3 1\to 5,1\to 3 15,13,则所产生的图就是原图的生成子图。
  • 与一个顶点 V V V 相关联的边的条数,称为 V V V度(Degree),记作 d ( V ) d(V) d(V)
    在一个图中的一个顶点,和它相连的边的条数,就是它的度。
    2 2 2 中, 5 5 5 的度为 4 4 4 2 2 2 的度为 2 2 2 1 1 1 的度为 3 3 3
  • 对于有向图,与一个顶点 V V V 相关联的边中,以 V V V终点的边的个数,称为 V V V入度(In-Degree),这些边称为 入边(In-Edge);与一个顶点 V V V 相关联的边中,以 V V V起点的边的个数,称为 V V V出度(Out-Degree),这些边称为出边(Out-Edge)
    有向图中的一个顶点,所有指向它的边的个数,就是它的入度,这些边是入边;除了这些边以外和它相连的边的条数,就是它的出度,这些边是出边。
    1 1 1 中, 5 5 5 的入度为 3 3 3,出度为 1 1 1 6 6 6 的入度为 3 3 3,出度为 0 0 0
  • 若一条边的两个顶点相同,则这条边是一个自环(Loop)(并查集的初始化其实就是自环)。
  • 图中的一条闭合的路径,称为环(Circuit)

以上是一些基本的概念,其他大多数概念可以通过逐步的学习理解。
另外注意:树是一种特殊的图。

2. 图的存储

和 「数据结构详解·一」树的初步 的第二部分相同。
无向图连接 u , v u,v u,v,就是 g[u][v]=g[v][u]=1;;有向图就是 g[u][v]=1;
但是这里再补充一部分内容。

2-1. 边表

不常用。主要在 Kruskal(一种最小生成树算法,将在以后讲到)等算法中用到。
直接用结构体存, g i = ( u , v ) g_i=(u,v) gi=(u,v)。对于无向图,表示 u − v u-v uv;对于有向图,表示 u → v u\to v uv

struct node{
	int u,v;
}g[100005];

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i].u>>a[i].v;
	}
	//...
}

对于寻找与结点 x x x 相连的边,需要 O ( m ) O(m) O(m) 的时间,显然很慢,故不常用。

2-2. 带权图的存储

邻接矩阵只要将 g[u][v]=1; 变为 g[u][v]=w; 即可,但是缺点是无法存重边(比如,输入中给出了 u=1 v=2 w=3u=1 v=2 w=-2,意味着 1 , 2 1,2 1,2 间有两条边)。另外,矩阵初始化要变为 + ∞ +\infin + − ∞ -\infin 以表示两条边未连接(因为可能有负权边)。

邻接表只要用 pair 或结构体来代替 vector 中的内容(对于 a x a_x ax y , z y,z y,z 分别代表连接的边和权值),无需担心重边。

边表和邻接表类似,修改结构体的内容即可。

3. 图的遍历

所有代码均为邻接表存储。

3-1. 深度优先遍历(DFS)

和 「数据结构详解·一」树的初步 4 − 1 \mathbf{4-1} 41 类似,但是由于图的特性,我们要记录 f i f_i fi 表示其是否走过。

void dfs(int p)//p 为当前节点编号
{
	if(f[p]) return;//走过了
	cout<<p<<' ';
	f[p]=1;
	for(auto i:g[p])
	{
		dfs(i);
	}
}

3-2. 广度优先遍历(BFS)

和 「数据结构详解·一」树的初步 4 − 3 \mathbf{4-3} 43 类似,但是由于图的特性,我们要记录 f i f_i fi 表示其是否走过。

queue<int>q;
void bfs()
{
	q.push(root);//root 为遍历的起始节点
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		if(f[x]) continue;
		f[x]=1;
		cout<<x<<' ';
		for(auto i:g[x])
		{
			q.push(i);
		}
	}
}

4. 例题详解

4-1. Luogu P5318 【深基18.例3】查找文献

只要将本文章的 3 \mathbf{3} 3 的内容套用即可。

4-2. Luogu P3916 图的遍历

如果我们直接暴力对于每个点查找,那是必定超时的。
题目问的是每个点所到达编号最大的点,那我们可以先反向建图,然后编号从大到小搜索,第一次搜索到的点就是答案(因为第二次搜到时编号因为是越来越小,因此不会比之前大)。
那这样的话,每个点只会遍历的到一次,时间复杂度由 O ( ( n + m ) n ) O((n+m)n) O((n+m)n) 变为了 O ( n + m ) O(n+m) O(n+m)
参考代码:

#include<bits/stdc++.h>
using namespace std;

vector<int>g[100005];
int n,m,ans[100005];

void dfs(int fr,int p)
{
	if(ans[p]) return;//搜过了
	ans[p]=fr;
	for(auto i:g[p])
	{
		dfs(fr,i);
	}
}

int main()
{
	cin>>n>>m;
	while(m--)
	{
		int u,v;
		cin>>u>>v;
		g[v].push_back(u);//反向建图
	}
	for(int i=n;i>=1;i--)
	{
		dfs(i,i);
	}
	for(int i=1;i<=n;i++)
	{
		cout<<ans[i]<<' ';
	}
 	return 0;
}

5. 巩固练习

  • Luogu B3643 图的存储
  • Luogu B3613 图的存储与出边的排序

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

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

相关文章

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现

基于JavaWEB SSM SpringBoot婚纱影楼摄影预约网站设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末…

天宝营养冲刺深交所IPO:业绩明显波动,深创投是股东

撰稿|汤汤 来源|贝多财经 近日&#xff0c;贝多财经发现&#xff0c;天宝动物营养科技股份有限公司&#xff08;下称“天宝营养”&#xff09;递交预披露更新招股书&#xff0c;准备在深圳证券交易所主板上市&#xff0c;红塔证券为其独家保荐人。本次冲刺上市&#xff0c;天…

《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享(16)

​《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限&#xff0c;如果错误欢迎批评指正。 第四章&#xff1a;Protein Binding Leads to Biological Actions &#xff08;蛋白质的结合会产生生物作用&#xff09; -在变构中&#xff0c;…

大神推荐,这几个电脑实用技巧,让你电脑用起来更加流畅舒服

电脑在我们的日常生活中&#xff0c;往往承担着“办公学习”的作用&#xff01;所以我们应该掌握哪些常用、好用的电脑使用技巧呢&#xff1f;今天就给大家分享下&#xff0c;我日常在使用电脑过程中&#xff0c;经常会使用到的几个电脑使用技巧&#xff01;第一&#xff1a;快…

基于FPGA的UDP 通信(三)

目录 引言 设计框图 UDP接收模块 设计源码 TEST BENCH 仿真结果 引言 前文链接&#xff1a; 基于FPGA的UDP 通信&#xff08;一&#xff09; 基于FPGA的UDP 通信&#xff08;二&#xff09; 本文基于FPGA设计千兆以太网通信模块&#xff1a;FPGA接收上位机数据。后续…

端到端的传输协议

&#xff08;一&#xff09;如何在一条物理链路上进行有效和可靠的数据传输 ——数据链路层传输协议 &#xff08;1&#xff09;标识高层送下来的数据块的起止、特定内容&#xff08;例如校验比特&#xff09;的位置 ——组帧技术 &#xff08;2&#xff09;如何发现传输中的错…

数据结构---线性表

刘佳瑜*&#xff0c;王越 *, 黄扬* , 张钊* (淮北师范大学计算机科学与技术学院&#xff0c;安徽 淮北) *These authors contributed to the work equllly and should be regarded as co-first authors. &#x1f31e;欢迎来到数据结构的世界 &#x1f308;博客主页&#xff1…

回溯法--最大团问题

问题描述什么是最大团&#xff1f;最大团的定义&#xff1f;完全图&#xff1a;如果无向图中的任何一对顶点之间都有一条边&#xff0c;这种无向图称为完全图。完全子图&#xff1a;给定无向图G(V,E)。如果U⊆V&#xff0c;且对任意u&#xff0c;v⊆U 有(u&#xff0c;v) ⊆ E&…

ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-5-02:串口发送数据-hello world

【源码、文档、软件、硬件、技术交流、技术支持&#xff0c;入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取&#xff0c;免安装&#xff0c;解压即用】 持续更新中&#xff0c;欢迎关注&#xff01; 前面《ZigBee 3.0实战教程-Silicon Labs EFR32EmberZnet-5…

90 后学霸博士 8 年进击战:用机器学习为化工研究叠 BUFF

本文首发自微信公众号&#xff1a;HyperAI超神经 内容一览&#xff1a;ScienceAI 作为近两年的技术热点&#xff0c;引起了业界广泛关注和讨论。本文将围绕 ScienceAdvances 的一篇论文&#xff0c;介绍如何利用机器学习&#xff0c;对燃煤电厂的胺排放量进行预测。 关键词&…

初始化一个GCP项目并用gcloud访问操作

1 简介 谷歌云GCP&#xff08;Google Cloud Platform&#xff09;是由Google提供的云平台&#xff0c;还是为用户提供了许多免费的产品&#xff0c;还是可以尝试一下的。对于学习或者小项目&#xff0c;都可以使用。 2 创建一个新项目 要使用GCP&#xff0c;我们需要创建一个…

【日常业务开发】常用JSON库API

【日常业务开发】常用JSON库APIGsonJava 对象转 Json字符串(序列化)Json字符串转Java 对象(反序列化)FastJsonJava 对象转 Json字符串(序列化)Json字符串转Java 对象(反序列化)JacksonJava 对象转 Json字符串(序列化)Json字符串转Java 对象(反序列化)Json 字符串内容反序列化为…

计算机网络各层设备故障及可行的解决方案

计算机网络分层 我们采用某五层模型进行研究 根据有关资料的统计&#xff0c;网络发生故障具体分布为&#xff1a; 应用层占3%&#xff1b; 表示层占7%&#xff1b; 会话层占8%&#xff1b; 传输层占10%&#xff1b; 网络层占12%&#xff1b; 数据链路层占25%&#xff…

大数据开发-Linux操作

目录1.1 touch:创建空文件1.2 mv :move 剪切粘贴--重命名和移动功能1.3 cat命名&#xff1a;查看文件内容1.4 cp &#xff1a;copy 复制粘贴1.5 ps、kill、ifconfig、clear1.6 回顾&#xff1a;1.1 touch:创建空文件 touch a.txt b.txt — 创建空文件a.txt与b.txt touch /root…

数据结构与算法(二)——递归算法

目录 前言 递归算法 1、什么是递归算法 2、核心理念 3、代码演示 4、问题探讨&#xff1a;只递不归会怎样&#xff1f; 5、小结 递归实例&#xff1a;汉诺塔问题 1、故事引入 2、移动盘子的逻辑 3、N个盘子的移动分析 4、代码实现N个盘子的移动 5、汉诺塔移动次数计…

文本到图像模型,如何快速生成高质量图片? #Google Muse AI

AIGC 的存在&#xff0c;大大提高了创作者的生产效率&#xff0c;目前&#xff0c;市面上也出现了许多快速生成图像的 AI 图像模型。近日&#xff0c;谷歌的 Muse AI 系统亮相&#xff0c;使用 AI 生成图片又多了一个选择工具&#xff01;Google Muse AI 图源&#xff1a;Muse …

【参考答案】java基础练习:选择结构(if、switch)

if&#xff1a;if...else...及if嵌套 提示用户输入三个整数&#xff0c;判断并输出最大值、最小值 package com.qzcsbj;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner input new Scanner(System.in);System.out.print("…

【正点原子FPGA连载】第十二章U-Boot移植 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十二章U-Boot移…

CVR预估模型ESMM

1. 概述 一般在对CVR建模的过程中&#xff0c;正样本选择的是在点击后有转化的样本作为正样本&#xff0c;负样本则是在点击后没有转化的样本作为负样本。然而&#xff0c;这样的建模方式存在一定的问题&#xff1a; Sample Selection Bias&#xff08;SSB&#xff09;问题&a…

ArcGIS基础实验操作100例--实验90创建点、线、面要素混合的Voronoi

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验90 创建点、线、面要素混合的Voronoi 目录 一、实验背景 二、实验数据 三、实验步骤 …