首页 > 其他分享 >图的建图(hjyowl讲解)

图的建图(hjyowl讲解)

时间:2024-07-29 17:55:43浏览次数:5  
标签:遍历 idx int 清空 ne 建图 vector 讲解 hjyowl

上次讲了一些图的概念,如下:

图论基础概念(详细讲解)-CSDN博客

今天我们讲一下c++如何构建一个图,大概有三种方法。

第一种:邻接矩阵存图,这个很简单,一个二维数组代表两个点之间是否有边/边权长度,便利的时候直接枚举n个点,看有没有链接(直接判断有没有值)。

优点:好理解简单粗暴好写,稠密图(点很少边很多,完全图就属于稠密图)时效率较高。

缺点:数组很大,对于较大的数据,会爆掉,遍历时间复杂度在稀疏图(空图,点多边少)时很吃亏。

第二种:邻接表存图:

邻接表,说白了就是把矩阵优化了,相当于我一个点有一个点集,代表我连上的点,这样对于稀疏图很快很快。

第一种方法就是vector,这种方法比较好些,只需要定义n个vector就可以了,遍历也比较好,就是vector天生常数较大,而且容易炸掉(有些人喜欢从1开始遍历,有可能这样遍历着要么少便利一个,要么多遍历一个(RE))

代码大概这样:

const int N = 1000010;
vector<int>g[N];//建立n个vector
int main(){
    int n,m;
    cin >> n >> m;
    while (m -- ){
        int a,b;
        cin >> a >> b;
        g[a].push_back(b),g[b].push_back(a);//建立双向边
    }
    for (int i = 0; i < g[1].size(); i ++ ){//遍历1号点连接的点
        int v = g[1][i];//获取连接的节点
        cout << v << " ";    
    }
    return 0;
}

这个方法看着好些但是不好。

2.链式前向星存图!

这个方法最推荐!其实不需要知道太多,说白了就是用链表来代替数组罢了,快很多,而且没有常数,代码就是这样。

const int N = 1000010,M = 20000010;
int h[N],e[M],ne[M],w[M],idx = 0;
void add(int a,int b,int c){//a->b长度为c的加边函数,不带边权就把w删掉即可
    e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx ++ ;
}
清空:memset(h,-1,sizeof h),idx = 0;
遍历:for (int i = h[1]; ~i; i = ne[i]){//~i=i!=-1
        int j = e[i];//获取链接节点(i是代表边的编号,这里不能直接用i)   
    }
这个写法有一个福利,对于无向图,如果我需要获得他的两条边(如果你加边的时候是让两条边放在一起建的),你可以直接使用i^1获取他的反向边。
对了记得一定要清空,不然很有可能炸(初始的时候也要清空)

好了就是这样,今天到这就结束了,下次讲最短路算法。

标签:遍历,idx,int,清空,ne,建图,vector,讲解,hjyowl
From: https://blog.csdn.net/hjyowl/article/details/140767676

相关文章

  • ARFoundation系列讲解 - 93 Immersal GoPro绘制地图
    一、Immerasal地图绘制的方式1.MapperAPP地图绘制:这种⽅式不需要数据处理操作,更适合⼩场景、测试使⽤。只能生成点云模型,无法生成真实环境网格模型。2. 全景相机地图绘制:使⽤全景相机采集原始数据建图的优势在于:全景图⽚视野覆盖范围⼤,可以⽤更少的照⽚完成较⼤场景地图(......
  • C语言中的函数(保姆级详细讲解)
    文章目录一.函数的概念1.1库函数1.2自定义函数二.函数的参数1.实参2.形参3.形参和实参的关系(传值调用)4.数组做函数参数(传址调用)三.函数的return语句四.函数的嵌套调用和链式访问1.嵌套调用2.链式访问五.static和extern1.作用域和生命周期2.static2.1s......
  • 最细哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)来源于代码随想录,十分
    20240725一、什么时候适用什么样的结构。1.java中1.1HashSet:1.2TreeSet:1.3LinkedHashSet:1.4HashMap:1.5TreeMap:1.6LinkedHashMap:1.7总结2.c++中2.1std::unordered_set:2.2std::set:2.3std::multiset:2.4std::unordered_map:2.5std::map:2.6std::multimap:3代码......
  • 05 详细的中断讲解
    目录前言一、什么是中断二、如何使用中断1.stm32中断结构1.1AFIO中断引脚选择1.2EXTI边缘检测1.3NVIC优先级配置2.配置stm32的中断1.打开时钟2.配置GPIO口3.配置AFIO控制4.配置EXTI功能5.配置NVIC6.配置完整代码3.书写中断服务函数总结前言又鸽了几天的文章,最近在做一个手表......
  • 【linux】【设备树】具有 GPIO 控制器和连接器的硬件配置的备树(Device Tree)代码讲解
    具有GPIO控制器和连接器的硬件配置的备树(DeviceTree)代码讲解背景-学习Linux设备树代码soc{soc_gpio1:gpio-controller1{#gpio-cells=<2>;};soc_gpio2:gpio-controller2{#gpio-cells=<2>;};};connector:connect......
  • 视频解码基础讲解
    视频解码流程视频解码的具体步骤如下:查找指定的解码器avcodec_find_decoder根据指定的解码器ID初始化相应裸流的解析器av_parser_init分配解码器上下文avcodec_alloc_context3打开解码器和关联解码器上下文avcodec_open2读取原始裸流fread解析出一个完整的数据包av_p......
  • 音频解码基础讲解
    音频解码流程音频解码的总体流程如下:输入音频格式(例如AAC)通过音频解码器进行解码得到PCM数据FFmpeg解码流程音频解码的具体步骤如下:查找指定的解码器avcodec_find_decoder根据指定的解码器ID初始化相应裸流的解析器av_parser_init分配解码器上下文avcodec_alloc_conte......
  • 【C++进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解
    前言:在前面,我们已经学习了很多存储机构,包括线性存储、树性存储等,并学习了多种拓展结构,效率也越来越高,但是是否有一种存储结构可以在大部分问题中都一次找到目标值呢?哈希可能能实现目录一、哈希的概念二、哈希冲突三、哈希冲突解决3.1开放寻址法节点结构插入操作查......
  • 【Spring Cloud应用框架的讲解】
    ......
  • 基于SpringBoot+Vue的二手手机交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......