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

【算法】图的存储和遍历

作者:指针不指南吗
专栏:算法篇

🐾或许会很慢,但是不可以停下🐾

文章目录

  • 1. 图的存储
    • 1.1 邻接矩阵
    • 1.2 邻接表
  • 2. 图的遍历
    • 2.1 dfs 遍历
    • 2.2 bfs 遍历

1. 图的存储

  • 引入

一般来说,树和图有两种存储方式,树是无环连通图,树是特殊的图,这里只讲图。

图分成两种有向图和无向图

无向图:有向图建两条边,a->b , b->a

所以说,无向图是一种特殊的有向图 , 我们只讲 有向图的存储

1.1 邻接矩阵

二维数组, g[a][b] ,a 到 b 的边

比较浪费空间,适合存储 稠密图,用的比较少

1.2 邻接表

图和部分注释转自 acwing

在这里插入图片描述

  • 代码实现
#include<bits/stdc++.h>
using namespace std;//N : 节点数量
//M:边的数量
//i : 节点的下标索引
//idx : 边的下标索引const int N=100010,M=2*N;//h[N] : 表示 第 i 个节点的 第一条边的 idx
//ne[M] : 表示 与 第 idx 条边 同起点 的 下一条边 的 idx
//e[M] : 表示 第idx 条边的 终点 表示值int h[N],e[M],ne[M],idx;void add(int a, int b)  //插入一个 a->b 的边
{e[idx]=b;  // 记录 加入的边 的终点节点, 记录值h[idx]=h[a]; // h[a] 表示 节点 a 为起点的第一条边的下标,ne[idx] = h[a] 表示把 h[a] 这条边接在了 idx 这条边的后面,其实也就是把 a 节点的整条链表 接在了 idx 这条边 后面;目的就是为了下一步 把 idx 这条边 当成 a 节点的单链表的 第一条边,完成把最新的一条边插入到 链表头的操作;h[a]=idx++;   a节点开头的第一条边置为当前边,idx移动到下一条边
}int main()
{int n;cin>>n;memset(h,-1,sizeof h); //把每个头节点 初始化为 -1return 0;
}

2. 图的遍历

一般我们每个元素就遍历一次

两种搜索方式,每个点只遍历一次:深搜一边路走到黑 ;宽搜 一层一层的搜

边的权重 都相等,则使用 bfs 找最短路

2.1 dfs 遍历

  • 代码模板
#include<bits/stdc++.h>
using namespace std;const int N=100010,M=N*2;  //以有向图的格式存储无向图,所以每个节点至多对应2n-2条边int n;
int h[N],e[M],ne[M],idx;
bool st[N];void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}// 树 dfs 遍历 框架
void dfs(int u)  //遍历以 u 为根节点的子树
{if(u==n) return ;  //边界条件就是左右的点 都遍历过了for(int i=h[u];i!=-1;i=ne[i])  {int j=e[i]; // 去出当前节点编号if(!st[j]) //没有使用过,继续{st[j]=true;  //改变状态dfs(j);  //dfs 下一个节点,就是搜索以 j 为根节点的子树}}
}int main()
{cin>>n;memset(h,-1,sizeof h);  //给头节点 初始化return 0;
}
  • 例题

    链接:[acwing 846.树的重心]( 846. 树的重心 - AcWing题库 )

    给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。

    请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

    重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

    输入格式

    第一行包含整数 n,表示树的结点数。

    接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。

    输出格式

    输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

    数据范围

    1≤n≤10510^5105

    输入样例:

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

    输出样例:

    4
    
  • 思路

    1. 把树存在邻接表里面

    2. 开始找去除重心之后,使剩余几部分连通图中,每一部分节点最大数量 最小

      • 我们可以通过 dfs ,找到每个子树中节点数量
      • 算出一个子树的每一部分 ABC , 取他们的 最 max ,计算每一个节点的这几个部分

    在这里插入图片描述

  • 代码实现

    #include<bits/stdc++.h>
    using namespace std;const int N=1e5+10,M=2*N;  int n;
    int h[N],e[M],ne[M],idx;
    int ans=N;  //最小值,初始化为 一个最大数
    bool st[N];void add(int a,int b)
    {e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }int dfs(int u) //返回的是,去除 u 节点之后最大连通图的数量
    {st[u]=true;  //改变状态//size 表示子树连通块中点的数量(图中 B或者C)//sum 表示以 u 为根节点所有的子树点的数量(图中 x点+B+C)int size=0,sum=1; for(int i=h[u];i!=-1;i=ne[i])  //遍历以 u 为根节点的子树{int j=e[i];  //j 表示现在正在遍历的节点编号if (st[j]) continue;  //遍历过了,跳过进行下一个st[j]=true;  //改变状态int s=dfs(j);  //存的是,以 j 为根节点的所有子树的中点的数量size=max(size,s);  //取所有 子树中点数量最大的值 相当于比较图中的B,Csum+=s;  //sum+ 扩展的子树中点的数量}size=max(size,n-sum);  //相当于比较途中 各个部分 ABC 的最大值ans=min(size,ans);  //取最大值的最小值return sum;  //返回 以 u 为根节点的所有子树地最大值
    }int main()
    {cin>>n;memset(h,-1,sizeof h);for(int i=0;i<n;i++){int a,b;cin>>a>>b;add(a,b),add(b,a);  //注意这里是 无向图,有两条边}dfs(1);  //开始遍历树cout<<ans;  //输出结果return 0;
    }
    

2.2 bfs 遍历

  • 代码模板
//宽搜框架
queue<int > q;
q.push(1);  //把编号 1 节点放进去
while(!q.empty())
{int t=q.front();q.pop();//拓展所有t可以到的节点,邻点if(/*邻点x没有被遍历过*/){q.push(x);st[x]=1;d[x]=d[t]+1;}
}
  • 例题

    链接: 847. 图中点的层次 - AcWing题库

    给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。

    所有边的长度都是 1,点的编号为 1∼n。

    请你求出 1 号点到 n 号点的最短距离,如果从 1号点无法走到 n 号点,输出 −1。

    输入格式

    第一行包含两个整数 n 和 m。

    接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。

    输出格式

    输出一个整数,表示 1 号点到 n 号点的最短距离。

    数据范围

    1≤n,m≤10510^5105

    输入样例:

    4 5
    1 2
    2 3
    3 4
    1 3
    1 4
    

    输出样例:

    1
    
  • 思路

    我们第一发现这个点,就是源点到这个点的最短路径

    首先判断出来 这道题是使用 bfs

    然后 , 图的存储, 图的遍历 模板题

  • 代码实现

    #include<bits/stdc++.h>
    using namespace std;const int N=1e5+10,M=N*2;int n,m;  //n表示点,m表示边
    int h[N],e[M],ne[M],idx;
    bool st[N];
    int q[N],d[N];  //q表示队列,d表示距离void add(int a,int b)
    {e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }int bfs()
    {int hh,tt;  //hh表示队头,tt表示队尾q[0]=1;  //存储层次遍历序列 0号节点是编号为1的节点memset(d,-1,sizeof d);  //d[]==-1,表示没有被遍历过d[1]=0;  //储存每个节点到 起点 编号1 的距离while(hh<=tt){//取出 队头int t=q[hh++];//遍历t节点的每一个邻边for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];  if(d[j]==-1)  //j 没有没被扩展过{d[j]=d[t]+1;  //该点的距离+1,并且表示已经被扩展过了q[++tt]=j;  //把扩展的点放到队列里面去,压入队列}  }}return d[n]; //返回编号为 n 的节点到 起点的距离
    }int main()
    {cin>>n>>m;memset(h,-1,sizeof h);for(int i=0;i<m;i++)  //读入边{int a,b;cin>>a>>b;add(a,b);}cout<<bfs();return 0;
    }
    

    STL 队列实现 bfs

    int bfs()
    {queue<int> q;q.push(1);//  q[0]=1;  //存储层次遍历序列 0号节点是编号为1的节点memset(d,-1,sizeof d);  //d[]==-1,表示没有被遍历过d[1]=0;  //储存每个节点到 起点 编号1 的距离while(!q.empty()){int t=q.front();q.pop();for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(d[j]==-1){d[j]=d[t]+1;q.push(j);}}}
    }
    

Alt

相关文章:

【算法】图的存储和遍历

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录1. 图的存储1.1 邻接矩阵1.2 邻接表2. 图的遍历2.1 dfs 遍历2.2 bfs 遍历1. 图的存储 引入 一般来说&#xff0c;树和图有两种存储方式&#…...

文件如何批量复制保存在多个文件夹中

在日常工作中经常需要整理文件&#xff0c;比如像文件或文件夹重命名或文件批量归类&#xff0c;文件批量复制到指定某个或多个文件来中保存备份起来。一般都家最常用方便是手动一个一个去重命名或复制到粘贴到某个文件夹中保存&#xff0c;有没有简单好用的办法呢&#xff0c;…...

16N60-ASEMI高压MOS管16N60

编辑-Z 16N60在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.2Ω&#xff0c;是一款N沟道高压MOS管。16N60的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。16N60功耗&#xf…...

Open3D 多个点云配准(C++版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 多路配准(多个点云配准)是指在全局空间中对齐多个几何块的过程。输入的数据可以是点云或深度图像 P i P_i P...

java实现Hbase 增删改查

目录 一、新建一个maven工程 二、代码实现 2.1、配置hbase信息&#xff0c;连接hbase数据库 2.2、创建命名空间 2.3、创建表 2.4、删除表&#xff0c;删除之前要设置为禁用状态 2.5、添加数据 2.6、获取命令表空间 / tables列表 2.7、get方法查看表的内容 2.8、scan方法…...

1109. 航班预订统计 差分数组

1109. 航班预订统计 差分数组技巧适⽤于频繁对数组区间进⾏增减的场景 1.由数组a生成差分数组b{b[0]0,i0(或者b[0]a[0],i0)b[i]a[i]−a[i−1],i>01.由数组a生成差分数组b\left\{\begin{array}{l}b[0]0,i0(或者b[0]a[0],i0)\\ b[i]a[i]-a[i-1],i>0\end{array}\right. 1.由…...

图床搭建,使用typora上传

1. 准备gitee作为图床的仓库 新建仓库 准备仓库的私人令牌&#xff0c;后面配合使用 点击个人设置——》私人令牌 注意私人令牌&#xff0c;复制保存好&#xff0c;后面不能再看了 2. 准备PicGO&#xff0c;并进行相关配置 PicGo官方下载链接 下载安装好node.js,下载网址 安…...

低代码开发的优势是什么?

低代码开发的优势是什么?低代码开发这个概念这两年来经常出现在人们的视野中&#xff0c;市场对于低代码的需求也越来越庞大。 Gartner预测&#xff0c;到2025年&#xff0c;75%的大型企业将使用至少四种低代码/无代码开发工具&#xff0c;用于IT应用开发和公民开发计划。 可…...

Ip2Resion线上部署报数据越界及错误处理

上篇在本地测试调用Ip2Resigon解析行政区划 Ip2Region的Java本地实现运行正常&#xff0c;但部署到测试环境&#xff0c;抛出数组越界&#xff08;java.lang.ArrayIndexOutOfBoundsException&#xff09;异常。 环境信息 ip2Resion是2.7版本&#xff0c;对应文件后缀为 xdb。 …...

致敬我的C++启蒙老师,跟着他学计算机编程就对了 (文末赠书5本)

致敬我的C启蒙老师&#xff0c;跟着他学计算机编程就对了 摘要 讲述了一个故事&#xff0c;介绍了一位良师&#xff0c;一段因C而续写的回忆&#xff0c;希望对各位看官有所帮助和启发。 文章目录1 写在前面2 我的C启蒙老师3 谈谈老师给我的启发4 友情推荐5 文末福利1 写在前面…...

CSS中的伪元素和伪类

一直被伪类和伪元素所迷惑&#xff0c;以为是同一个属性名称&#xff0c;根据CSS动画&#xff0c;索性开始研究a:hover:after&#xff0c;a.hover:after的用法。 伪元素 是HTML中并不存在的元素&#xff0c;用于将特殊的效果添加到某些选择器。 对伪元素的描述 伪元素有两…...

逻辑优化基础-rewrite

简介 逻辑综合中的rewrite算法是一种常见的优化算法&#xff0c;其主要作用是通过对逻辑电路的布尔函数进行等效变换&#xff0c;从而达到优化电路面积、时序和功耗等目的。本文将对rewrite算法进行详细介绍&#xff0c;并附带Verilog代码示例。 一、算法原理 rewrite算法的…...

案例27-单表从9个更新语句调整为2个

目录 一&#xff1a;背景介绍 二&#xff1a;思路&方案 三&#xff1a;过程 1.项目结构 2.准备一个普通的maven项目&#xff0c;部署好mysql数据库 3.在项目中引入pom依赖 5.编写MyBitis配置文件 6.编写Mysql配置类 7.编写通用Update语句 8.项目启动类 四&#xff1a;总…...

Wordpress paid-memberships-pro plugins CVE-2023-23488未授权SQLi漏洞分析

目录 1.漏洞概述 2.漏洞等级 3.调试环境 4.漏洞代码 5 POC 1.漏洞概述 WordPress插件paid-memberships-pro版本<2.9.8中,容易受到REST路由“/pmpro/v1/order”的“code”参数中未验证的SQL注入漏洞的影响。攻击者可进行SQLi盲注,从而获取数据库权限。 CVE:...

【JavaWeb篇】JSTL相关知识点总结

目录 为什么会有JSTL&#xff1f; 什么是JSTL&#xff1f; 如何理解JSTL标准标签库呢&#xff1f; 如何使用JSTL&#xff1f; 第一步&#xff1a;引入JSTL标签库对应的jar包。 第二步&#xff1a;在JSP中引入要使用标签库。&#xff08;使用taglib指令引入标签库。&#x…...

【蓝桥杯刷题】坑爹的负进制转换

【蓝桥杯刷题】——坑爹的负进制转换&#x1f60e;&#x1f60e;&#x1f60e; 目录 &#x1f4a1;前言&#x1f31e;&#xff1a; &#x1f49b;坑爹的负进制转换题目&#x1f49b; &#x1f4aa; 解题思路的分享&#x1f4aa; &#x1f60a;题目源码的分享&#x1f6…...

react+antdpro+ts实现企业级项目二:Strapi及认证登陆模块

在上一章节中&#xff0c;我们已经成功创建并登陆了系统&#xff0c;现在需要为系统添加权限和登录认证&#xff0c;以提高系统的安全性、数据保护、个性化服务和用户体验。此外&#xff0c;添加权限和登录认证还可以方便管理员进行用户和授权管理。为了快速开发前端&#xff0…...

Android ANR trace日志如何导出

什么是ANR &#xff1f;上网搜索&#xff0c;一搜一大片&#xff0c;我就说个很容易识别的字眼&#xff0c;XXXAPP无响应 ANR trace日志如何导出&#xff1f;使用ADB命令&#xff1a; adb pull data/anr/trace.txt 你要存放的路径。查看ANR报错位置全局搜索你APP的包名&#x…...

Windows SSH 配置和SCP的使用

使用用户界面安装 ssh 功能 要在 Windows 10/11 上启用 SSH 服务器&#xff0c;请按照以下步骤操作&#xff1a; 按“Windows 键 I”打开“设置”菜单&#xff0c;然后选择“应用程序”。在左侧菜单栏中选择“应用和功能”。从列表中选择“可选功能”。 点击“添加功能”按钮…...

liunx 安装redsi和连接

liunx 安装redsi和连接 下载 &#xff08;https://download.redis.io/releases/&#xff09; 上传到 /usr/local目录 解压 tar -xvf redis-5.0.14.tar.gz 切换到 cd ./redis-5.0.14 编译 make 安装 make install 默认安装目录 /usr/local/bin/ 修改 ./redis-5.0.14/reds…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...