【图论】图的存储--链式前向星存图法以及深度优先遍历图

2024-04-10 19:28

本文主要是介绍【图论】图的存储--链式前向星存图法以及深度优先遍历图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图的存储

介绍

无向图-就是一种特殊的有向图->

只用考虑有向图的存储即可

有向图

  • 邻接矩阵
  • 邻接表

邻接表

在这里插入图片描述

存储结构:
(为每一个点开了一个单链表,存储这个点可以到达哪个点)

  • 1:3->4->null
  • 2:1->4->null
  • 3:4->null
  • 4:null
插入一条新的边

在这里插入图片描述

比如要插一条边:2->3

  • 先找到 2 对应的单链表
  • 然后将 3 插入到单链表里面去(一般使用头插)

对应的结构变化为:

  • 1:3->4->null
  • 2:3->1->4->null
  • 3:4->null
  • 4:null
插入边 Coding Part
#include <iostream>
#include <cstring>
#define p(e) print(e, sizeof(e)/sizeof(int))
using namespace std;const int N = 100010, M = N * 2;
//N表示结点数量上限,M表示结点数值上限int h[N], e[M], ne[M], idx;//插入一个a->b
inline void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;/** idx是没有使用的空结点索引* 先给这个位置赋值b					# e[idx] = b* 然后让这个结点指向头结点			# ne[idx] = h[a]* 然后再更新头结点 					# h[a] = idx++* 同时让idx移动到新的空结点索引中去 # idx++*/
}inline void print(int arr[], int n) {for (int i = 0; i < n; i++) cout << arr[i] << ' ';cout << endl;
}int main() {memset(h, -1, sizeof h);
}

遍历图

深度优先方法遍历图
  • 需要使用一个bool数组存放是否遍历的状态
  • 然后进行深度优先遍历
#include <iostream>
#include <cstring>using namespace std;const int N = 100010, M = N * 2;
//N表示结点数量上限,M表示结点数值上限int h[N], e[M], ne[M], idx;
bool st[N];
//插入一个a->b
inline void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;/** idx是没有使用的空结点索引* 先给这个位置赋值b					# e[idx] = b* 然后让这个结点指向头结点			# ne[idx] = h[a]* 然后再更新头结点 					# h[a] = idx++* 同时让idx移动到新的空结点索引中去 # idx++*/
}inline void dfs(int u) {st[u] = true;cout << u << ' ' ;for (int i = h[u]; i != -1; i=ne[i]) {int j = e[i];if (!st[j]) dfs(j);}
}int main() {memset(h, -1, sizeof h);memset(st, false, sizeof st);add(1, 3);add(3, 5);add(3, 6);add(1, 2);add(1, 8);dfs(1);
}
题目:树的重心

给定一棵树,树中包含n个结点,(编号为1~n)和n-1个无向边
请找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。
重心定义:重心是指树中的一个结点,如果将这个结点删除后,剩余各个连通块中点数的最大值最小,那么这个结点被称为树的重心。
输入格式
第一行包含整数 n,表示树的结点数。
接下来 n-1 行,每行包含两个整数 ab,表示 ab 之前存在的一条边。

输出格式
输出一个整数 m,表示重心的所有子树中最大子树的结点数目。

数据范围
1 <= n <= 105

输入样例

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

输出样例

4

答案代码

#include <iostream>
#include <cstring>using namespace std;const int N = 100001, M = N*2;
int h[N], e[M], ne[M], idx;
bool st[N];//a->b
void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}/*遍历模板*/
void dfs_template(int u) {st[u] = true;cout << u << ' ';for (int i = h[u]; i != -1; i = ne[i]) {int j = e[i];if (!st[j]) {dfs_template(j);}}
}int n;										//n为题目输入的结点数量
int ans = INT_MAX;							//初始化题目要求的最小值
int dfs(int u) {//每一棵树找到最大连通块的数量st[u] = true;int sum = 1, res = 0;							//sum统计子结点(包括自己)的数量, res统计儿子树最大连通块数量for (int i = h[u]; i != -1; i = ne[i]) {int j = e[i];if (!st[j]) {int s = dfs(j);sum += s;							//加上子节点的数量res = max(s, res);					//找到子树中的最大连通块}}res = max(res, n-sum);							//和父亲树进行比较ans = min(ans, res);							//更新答案return sum;
}int main() {memset(h, -1, sizeof ne);cin >> n;for (int i = 0; i < n-1; i++) {int a, b;cin >> a >> b;add(a, b), add(b, a);}dfs(1);cout << ans << endl;
}
宽度优先方法遍历图

补充两个图论的概念:

  • 重边: 例如,存在两条 1->2 的边,叫重边
  • 自环:例如,1->1叫自环
题目:图中点的层次

这篇关于【图论】图的存储--链式前向星存图法以及深度优先遍历图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891926

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs