前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >重拾算法-3.1-图论-图的存储

重拾算法-3.1-图论-图的存储

作者头像
luciozhang
发布于 2023-04-22 08:42:16
发布于 2023-04-22 08:42:16
18500
代码可运行
举报
文章被收录于专栏:前端lucio前端lucio
运行总次数:0
代码可运行

为什么会突然想起要重拾算法呢? 上次认真的学习、复习算法已经是3年以前了,那时候是为了校招,在这之后算法似乎变的不太重要。我只是矜矜业业地做好前端开发该做的工作,但在业务开发越来越熟练的时候,我发现自己的视野也会变的越来越窄。 做程序开发,广度和深度是同样重要的,也许现在的工作中不会直接用上,但是算法、设计模式等等这些底层的知识时候熟练掌握,是我们能不能走得更远的前提,我觉得是时候,再重拾起已经快遗忘的算法,为自己的下一个三年,储备更多的基础知识。 作为前端开发,本系列的算法代码实现,将全部用TypeScript实现,同时也会贴一些力扣的题目方便上手实践。

图的存储

本文主要介绍算法题中,有向图的存储方式。

1. 邻接矩阵

实现方式

图的结点编号为 1 ~ n

g[i][j] 表示点i到j的边权

若i到j没有边,g[i][j]视情况赋值-1、0、inf

存在问题:

​ 不能保存重边

​ 空间消耗太大O(n^2)

2. 邻接表 —— vector实现

实现方式

vector<int> g[], e[];

g[i][j] 保存以点i为起点的第j条边的终点

e[i][j] 保存相应边的边权

代码实现

添加边

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void add( int u, int v, int c ) 
{
    g[u].push_back(v);
      e[u].push_back(c);
}

遍历以u为起点的边

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for( int i = 0; i < g[u].size(); ++i ) 
{
    int v = g[u][i], c = e[u][i];
}

3. 邻接表 —— 数组实现

实现方式

结点编号 1 ~ n , 边编号 0 ~ e-1

int first[], to[], nxt[], cost[], e;

first[u] :以u为起点的第一条边的编号,初始为-1

to[i]: 边i的终点

nxt[i] :与边i起点相同的下一条边 的编号

cost[i] :边i的边权

e: 总边数

代码实现

添加边

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void add( int u, int v, int c )
{
    to[e] = v; cost[e] = c;
    nxt[e] = first[u];
    first[u] = e++;
}

遍历以u为起点的边

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for( int i = first[u]; i != -1; i = nxt[i] ) 
{
    int v = to[i], c = cost[i];
}

注意邻接表保存的是单向边,无向图需要插入两条有向

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for( int i = 0; i < m; ++i ) {
    scanf(%d%d”, &amp;u, &amp;v );
    add(u, v); add(v, u);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++如何处理图的存储方式
稀疏图,就是点数的平方与边数差的特别多,边数少,但点数多,就不行了,因为空间占用太大了。
苏州程序大白
2022/04/14
4540
C++如何处理图的存储方式
图的存储
1. 邻接矩阵 ---- 思想: 利用二维数组 g[N][N] 存储所有的点到点的权值。 其中 N 为点的数量,g[i][j] 表示点 i 到点 j 的权值。 图片 应用: 只在点数不多的稠密图使用。 大部分情况下点的数量 $n = 10^3$,边的数量 $m = 10^6$。 示例: 现有 n 个点共 m 条边,以及每条边的起始点和终点及权值。 这些点和边共同构成一个有向图。 存储这些信息并输出。 图片 输入: 4 5 1 2 20 1 4 40 2 3 50 2 4 60 3 2 30 代码: #in
浪漫主义狗
2023/01/11
3370
图的存储
Dijkstra算法求单源最短路径
在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同。如果是一个带权图,那么路径长度为路径上各边的权值的总和。两个顶点间路径长度最短的那条路径称为两个顶点间的最短路径,其路径长度称为最短路径长度。
恋喵大鲤鱼
2018/08/03
2.5K0
Dijkstra算法求单源最短路径
图图的存储、BFS、DFS(听说叠词很可爱)
图的基本概念中我们需要掌握的有这么几个概念:无向图、有向图、带权图;顶点(vertex);边(edge);度(degree)、出度、入度。下面我们就从无向图开始讲解这几个概念。
syy
2021/03/03
1K0
图图的存储、BFS、DFS(听说叠词很可爱)
数据结构与算法-图的存储结构
设G=(V,E)是n个顶点的图,则G的邻接矩阵用n阶方阵G表示,若(Vi ,Vj )或< Vi ,Vj >属于E(G),则G[i][j]为1,否则为0。
越陌度阡
2020/11/26
2.1K0
数据结构与算法-图的存储结构
图算法之bfs、dfs、prim、Dijkstra
概述 在图算法中经常要执行遍历每个顶点和每条边的操作,即图搜索。许多图算法都以图搜索为基础,如2-着色问题、连通性计算基于深度优先搜寻(depth-first search, DFS),而无权最短路径则基于广度优先搜索(breadth-first search, BFS)。基于搜索的算法还包括计算最小生成树的Prim算法以及计算最短路径的Dijkstra算法。图实现算法在现实的算法结构中占据重要的部分。 图 图的定义 图G是由顶点的有穷集合,以及顶点之间的关系组成,顶点的集合记为V,顶点之间的关系构成边的集
xiangzhihong
2018/02/06
2.9K0
图算法之bfs、dfs、prim、Dijkstra
图的四种最短路径算法
本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法
全栈程序员站长
2022/09/05
6170
地图导航的幕后英雄:图论如何改变出行?—全程动画可视化数据结构算法之图
盛透侧视攻城狮
2025/03/17
2470
地图导航的幕后英雄:图论如何改变出行?—全程动画可视化数据结构算法之图
为实习准备的数据结构(11)-- 图论算法 集锦
又要画图了。一到这里就莫名其妙的烦,之前写过的图相关博客已经让我都删了,讲的语无伦次。 希望这篇能写好点。
看、未来
2021/09/18
6000
图论建图
图论建图无外乎邻接表建图和链式前向星建图,不要问我是怎么知道的,要是你的学校逼你打图论位的话你就知道了。
ACM算法日常
2018/12/28
9030
重拾算法-3.2-图论-并查集
通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。
luciozhang
2023/04/22
2880
数据结构 第六章 图
图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合。 在线性表中,元素个数可以为零,称为空表; 在树中,结点个数可以为零,称为空树; 在图中,顶点个数不能为零,但可以没有边。
Twcat_tree
2022/11/29
4920
数据结构  第六章  图
期末复习之数据结构 第7章 图
含有n个顶点的无向完全图有多少条边? n×(n-1)/2条边 含有n个顶点的有向完全图有多少条弧? n×(n-1)条边
henu_Newxc03
2021/12/28
6730
期末复习之数据结构 第7章 图
数据结构:图结构
设图 G = (V, E)是一个有 n 个顶点的图,则图的邻接矩阵G.arcs[n][n]定义为:
ttony0
2022/12/26
1.6K0
数据结构:图结构
地图导航的幕后英雄:图论如何改变出行?—全程动画可视化数据结构算法之图算法题目试炼
盛透侧视攻城狮
2025/03/24
1140
地图导航的幕后英雄:图论如何改变出行?—全程动画可视化数据结构算法之图算法题目试炼
算法基础学习笔记——⑪拓扑排序\最短路
时间复杂度 平均情况下 O(m),最坏情况下 O(nm), n 表示点数,m 表示边数
命运之光
2024/03/20
1560
算法基础学习笔记——⑪拓扑排序\最短路
图论基础,如何快速上手图论?
前面我们学过了一些基本的数据结构,像顺序表,链表,栈,队列,树等...其中最有难度的就属树的部分了,而图论的与树也是有关联的,在后续我们经常可以看到一些图类似树,但是又不是树,他们的区别在哪?二叉树是父亲节点和孩子的关联,是从上到下的,而图没有父亲节点和孩子节点,他主要使用节点描述各个事件之间的关系;
啊QQQQQ
2025/01/20
1030
图论基础,如何快速上手图论?
【c++高阶DS】图
比如:某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不同的学校,起先互不相识,每个学生都是一个独立的小团体,现给这些学生进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 给以下数组用来存储该小集体,数组中的数字代表:该小集体中具有成员的个数
用户11029103
2024/12/25
980
【c++高阶DS】图
图的存储结构
废话不多说,上来撸干货。 我们知道,实现图共有两种常用的方法:邻接矩阵、邻接表法。接下来我们就来一一介绍这两种方法。 实际上,图的存储结构有些复杂,为了方便读者理解,也为了方便笔者的写作,这部分的篇幅会长一些,稍有些啰嗦,还望见谅。
roobtyan
2019/02/21
1.1K0
图的存储结构
最短路径四大算法「建议收藏」
熟悉的最短路算法就几种:bellman-ford,dijkstra,spfa,floyd。 bellman-ford可以用于边权为负的图中,图里有负环也可以,如果有负环,算法会检测出负环。 时间复杂度O(VE); dijkstra只能用于边权都为正的图中。 时间复杂度O(n2); spfa是个bellman-ford的优化算法,本质是bellman-ford,所以适用性和bellman-ford一样。(用队列和邻接表优化)。 时间复杂度O(KE); floyd可以用于有负权的图中,即使有负环,算法也可以检测出来,可以求任意点的最短路径,有向图和无向图的最小环和最大环。 时间复杂度O(n3); 任何题目中都要注意的有四点事项:图是有向图还是无向图、是否有负权边,是否有重边,顶点到自身的可达性。 1、Dijkstra(单源点最短路) 这个算法只能计算单元最短路,而且不能计算负权值,这个算法是贪心的思想, dis数组用来储存起始点到其他点的最短路,但开始时却是存的起始点到其他点的初始路程。通过n-1遍的遍历找最短。每次在剩余节点中找dist数组中的值最小的,加入到s数组中,并且把剩余节点的dist数组更新。
全栈程序员站长
2022/09/06
6810
最短路径四大算法「建议收藏」
相关推荐
C++如何处理图的存储方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验