图论基础--存储边的4种方式

图论基础 图概述 图(Graph)是一种比线性结构和树形结构都要复杂的数据结构。简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成。其中,数据元素常称作顶点(vertex),数据之间的关系常称作边(edge)。故图可记为G=<V,E>,其中V是顶点的有穷非空集合,E是边的集合。在图中顶点的前驱和后继是不设限制的,因此图描述的是一种网状关系。 无向图 若边是无序的或者说是无向的,则称此图是无向图。若无向图中有边(v1,v2)(无向图中边用圆括号表示),则显然(v2,v1)和(v1,v2)是同一条边。 阅读详情

邻接矩阵

作为最简单的存边方式,那当然是要掌握啦。基本原理就是利用f[n][n]来存边。f[i][j]的值若为真,则表明I与j间存在边,否则没有边。既可以存单向边也可以存双向边。同时f也可以存储边的权值。另外根据矩阵乘法的定义,f*f可以表示经过一个中间点后的链接状态。缺点也很明显啦,所占内存过大(尤其是存双向边时),遍历寻找下一个点时效率低等。总体来说数据不是太刁钻时就可以用。

相关复杂度

时间o(n ^ 2) , 空间o(n ^ 2)。

代码实现

#include<iostream>
using namespace std;
int f[505][505];
int n,m;
void src(int u)//遍历 
{
 for(int i=1;i<=n;i++)
 {
  if(f[u][i])
  {
   src(i);
  }
 }
}
int main()
{
 scanf("%d%d",&n,&m);
 for(int i=0;i<m;i++)//插入,删除再赋值为0就好了 
 {
  int x,y,z;
  scanf("%d%d%d",&x,&y,&z);//单向边,双向边记得反过来再来一遍 
  f[x][y]=z;
 }
 src(1);
 return 0;
}

邻接链表

主要用来存稀疏图。基本原理是利用多个单向链表来存边。

相关复杂度

时间o(n+m),空间o(n+m)

代码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
int tol;
int hd[50],nxt[500],num[500],w[500];
void add(int u,int v,int w1)
{
 if(hd[u])
 {
  int now=hd[u];
  while(nxt[now]) now=nxt[now];
  tol++;
  nxt[now]=tol;
  num[tol]=v;
  w[tol]=w1;
  return;
 }
 else
 {
  tol++;
  hd[u]=tol;
  tol++;
  nxt[hd[u]]=tol;
  num[tol]=v;
  w[tol]=w1;
 }
}
void del(int x,int y)
{
 int pr,now=hd[x];
 while(num[now]!=y) pr=now,now=nxt[now];
 nxt[pr]=nxt[now];
}
int main()
{
 scanf("%d%d",&n,&m);
 for(int i=1;i<=m;i++)
 {
  int x,y,z;
  scanf("%d%d%d",&x,&y,&z);
  add(x,y,z);//增加由x向y的边 
 }
 int x,y;
 scanf("%d%d",&x,&y);
 del(x,y);//删除x到y的边 
 for(int i=1;i<=n;i++)
 {
  printf("%d\n",i);
  int now=nxt[hd[i]];
  while(num[now])
  {
   printf("%d %d\n",num[now],w[now]);
   now=nxt[now];
  }
 }
 return 0;
 } 

链式前向星

这个也比较常用。主要是利用结构体edge来存边,但在使用前需要预处理数据以加快使用。

代码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,tol;
int hd[55];
struct edge{
 int to;//另一个点
 int w;//权
 int nxt;//下一个同起点边的下标 
}e[5005];
void add(int u,int v,int k)
{
 tol++;
 e[tol].nxt=hd[u];
 e[tol].to=v;
 e[tol].w=k;
 hd[u]=tol;
}
void del(int u,int v)
{
 int pr=0;
 for(int i=hd[u];i;i=e[i].nxt)
 {
  if(e[i].to==v)
  {
   if(i==hd[u]) hd[u]=e[i].nxt;
   else e[pr].nxt=e[i].nxt;
   return;
  }
  pr=i;
 }
}
int main()
{
 scanf("%d%d",&n,&m);
 for(int i=1;i<=m;i++)
 {
  int x,y,z;
  scanf("%d%d%d",&x,&y,&z);
  add(x,y,z);//增加x到y的边 
 }
 int x,y; 
 scanf("%d%d",&x,&y);
 del(x,y);//删除x到y的边; 
 for(int i=1;i<=n;i++)
 {
  printf("%d\n",i);
  for(int j=hd[i];j;j=e[j].nxt)
  {
   printf("%d %d\n",e[j].to,e[j].w);
  }
 }
 return 0;
}

vector邻接表

简单来说就是邻接矩阵的优化版本。

代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
vector<int>map[55];
int main()
{
 int n,m;
 scanf("%d%d",&n,&m);
 for(int i=1;i<=m;i++)
 {
  int x,y;
  scanf("%d%d",&x,&y);
  map[x].push_back(y);
 }
 int x,y;
 scanf("%d%d",&x,&y);
 for(int i=0;i<map[x].size();i++)
 {
  if(map[x][i]==y)
  {
   map[x].erase(map[x].begin()+i);
   break;
  }
 }
 for(int i=1;i<=n;i++)
 {
  int len=map[i].size();
  printf("%d\n",i);
  for(int j=0;j<len;j++)
  {
   printf("%d ",map[i][j]);
  }
  cout<<endl;
 }
 return 0;
}
OI学习笔记之图论基础知识 图论基础知识 没有用的话qaq : Ummmm…图论的大部分知识本来早就有学过,只是一直没有写成博文来梳理,但既然上了qbxt DP图论就写一篇来总结下,主要是来听图论的,但…由于太菜的原因,DP听得天花乱坠QWQ 一,图:图是边和点组成的几何体 G=< V , E > V是点集合,E是边集 形如这样的东西就是一个图 二,图的相关基本概念 1,边:图上连接点和点之间的东西叫做边... 阅读详情

相关推荐

图论基础和图论算法

图论基础 图的基础知识 图论的基本研究对象,图由节点和边组成。 节点 图二、图二中黑色的圆圈就是节点,表示某个事物或对象。 边 图二、图二中顶点之间灰色的线条就是边,表示事物与事物之间的关系。 权值 权值,即每条边都有与之对应的值。例如当顶点代表某些物理地点时,两个顶点间边的权重可以设置为路网中的开车距离(例如:从北京到上海的铁路1300km,从上海到重庆的铁路1600km,这里就是分别把北京、...

洛谷棕名用户的博客(兔子的博客) 1160

【图论】图的存储

一,直接存边 二,链式前向星 开一个数组存储每个点引出的第一条边,然后存储每个点作为起点的每条边,这样就可以做到不重不漏。 当中有对链式前向星的介绍 题解 P4779 【【模板】单源最短路径(标准版)】 - 2018一维 的博客 - 洛谷博客 (luogu.com.cn) 代码: //图存储方式:链式前向星 #include<cstdio> #include<iostream> #include<queue> using namespace std

Kokli的博客 270

简单好理解的图论讲解(图论的三种表现形式以及相关操作)

图论是数据结构与算法中必须逾越的一座大山,适用范围非常广泛,当然也具有一定的难度,本人也是今年第一次学习图论的知识点,不能说掌握的很好,但我会尽可能的把我学会的知识点分享给大家,在写这篇博客之前我也查阅了很多大牛的图论分享,也算基本上涵盖了图论的重要知识点,如有错误还望各路大神斧正。另外以下程序都是由C语言编写的,海域。 首先我们简单认识一下图论,我举一个最简单的例子,就是我们常用的百度或者高德地图,我们在导航时,背后的本质就是图论的各种算法,例如是否有通路可以抵达,或者最...

weixin_55469859的博客 2560

图论(一)——边的储存(邻接矩阵、邻接表、链式向前星)

对于图论而言,一共有三种存边的方式:邻接矩阵、邻接表、链式向前星 邻接矩阵 邻接矩阵即用二维数组储存 int graph[Len][Len]; graph[i][j] //这个表示的即是表示从节点i到节点j的边权值 /* 用一个二维数组存边, 可以将数组的所有元素的值都初始化为某一个数k (要保证后面输入边权值时不会出现k), 表示此时从i节点到j节点的边不存在 */ 优点:适合稠密图,...

i_want_to_studyi的博客 1000

简单说说Python中的pip如何换源

【安装包】:pip install 【升级包】:pip install --upgrade 【卸载包】:pip uninstall 【查看已安装的包】:pip list【搜索包】:pip search (注意:pip search功能在pip 10.0.0之后被弃用,建议使用其他方式搜索包,如访问PyPI官网或使用其他搜索引擎)

一捌柒的博客 2667

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2784

图论笔记1:存图方式

文章目录前言一、邻接矩阵1.声明邻接矩阵2.使用邻接矩阵存边二、邻接表1.邻接表的使用三、链式前向星1.链式前向星的使用总结 前言 图论的基础就是存图,存图的方式有许多种,一般就三种:邻接矩阵,邻接表,链式前向星。 一、邻接矩阵 邻接矩阵的简单来说就是一个数组两个端点的下标就是这条边的起始端点和最终端点,可以直接用下标访问,存边的时间复杂度和调用此边的复杂度都为O(1),但是缺点在于他的空间复杂度为O(n²),只能存小图以及存稀疏图空间浪费太大 1.声明邻接矩阵 int maps[maxn][maxn.

qq_43085783的博客 267

西门子S7-1200与汇川SV660F伺服Profinet通讯调试实战

在工业自动化领域,Profinet作为工业以太网标准协议,凭借其高实时性和灵活组网能力,已成为伺服驱动器与PLC通讯的主流选择。其核心原理是通过设备名识别、IP分配以及标准报文(如111速度报文、105定位报文)传输控制字与状态字,实现驱动器的精准控制。相比传统脉冲或CANOpen方案,Profinet直连省去了协议转换网关,降低了成本与故障点,尤其适用于绕线设备、包装机械等中小型单轴或多轴运动控制系统。本文以西门子S7-1200 PLC搭配汇川SV660F伺服为例,完整梳理了从GSDMD组态、InoDri

weixin_29184371的博客 227

利用vector进行图的存储

2018-3-30 图的存储有多种方式,我个人比较常用的就是邻接矩阵(存储方式是用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组存储图中的边或者弧的信息),优点就是构建起来比较方便,而且我们也可以比较方便的知道任意两点是否有边无边。缺点是如果图中边比较少这样会比较浪费我们的存储空间。 但是这里我要说的是使用vector进行存图: #include&lt;iostream&gt;...

qq_34600424的博客 4893

OpenEarthMap 与 xBD 数据集合并

整合好的数据:链接: https://pan.baidu.com/s/1uJ_Zg6n-s3u1D49OW52D7Q?pwd=2vwx 提取码: 2vwx完整整合步骤与代码如下。

qq_60293814的博客 1594

2026年AI编程工作流实战:Claude Code与Open Code深度对比

AI编程已从代码生成工具升级为IDE级智能工作流核心能力。其本质是将大语言模型深度嵌入开发环境,通过语义理解、上下文感知与行动闭环重构传统编码范式。Claude Code以企业级知识图谱和双轨Code Review为代表,强调合规性、可审计与深度集成;Open Code则依托Skill可组合性、本地优先模型与ocp协议,实现开源驱动的灵活扩展。二者共同推动IDE从‘编辑器’进化为‘数字搭档’——能理解RFC文档、记住PR评论、自动补全带重试的fetch逻辑,并在Promise链发呆时一键重构为async/a

weixin_33739523的博客 462

个人总结---图的存储

【代码】个人总结---图的存储。

2302_79440616的博客 522

基于STM32设计的遥控灭火消防小车_296

随着城市化进程的加速和火灾发生频率的增加,传统的消防方式在应对初期火灾时存在反应慢、效率低等问题。为了提高火灾响应速度和灭火效率,本设计开发了一款基于STM32单片机的遥控灭火消防小车。该小车配备了烟雾检测、温湿度监测、火源定位、灭火操作等功能,能够通过蓝牙和WIFI实现远程控制与实时视频传输。设计采用了MQ2烟雾传感器、SHT30温湿度传感器、火光传感器和ESP32摄像头模块等硬件设备。系统不仅能够自动检测和定位火源,还可以手动调整灭火器对准位置,进行干粉灭火。此外,蜂鸣器用于火源报警,确保操作人员及时得

722

DS高阶:图论基础知识

图是比线性表和树更为复杂且抽象的结构,和以往所学结构不同的是图是一种表示型的结构,也就是说他更关注的是元素与元素之间的关系。

weixin_51142926的博客 3865

自动识别象棋棋子的OpenCV应用

在计算机视觉领域,OpenCV是一个广泛应用的开源计算机视觉库,它提供了丰富的图像处理和分析工具。本文将介绍如何使用OpenCV实现自动识别象棋棋子的功能,并提供相应的源代码。通过以上代码,我们可以实现对棋盘图像中棋子的自动识别。需要注意的是,以上代码只是一个简单的示例,实际应用中可能需要根据具体情况进行参数调整和算法优化,以获得更好的识别效果。函数利用预处理后的图像,寻找图像中的轮廓,并根据轮廓的面积筛选出可能的棋子轮廓,最后在原图像中提取棋子区域。在主程序中,我们读取输入图像,并调用。

WzisTypescript的博客 907

【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析

【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析

AI人人懂 3824

图的概念,图的存储,图的遍历与图的拓扑排序——从零开始的图论讲解(1)

本文将从最基础的概念讲起,介绍图的存储方式和怎么遍历图(BFS和DFS基本遍历),并深入拓扑排序及其应用,帮助你快速入门图论。目标是让你在短时间内掌握图论的核心知识,并具备独立完成LeetCode 简单及以上难度的图论题目的能力。博客很长,欢迎大家根据目录各取所需.这是该系列的第一篇,在后面的博客中,笔者还会讲解最短路径问题(Dijkstra、Bellman-Ford、SPFA)和最小生成树(Kruskal、Prim)等常见算法,帮助你建立图论基础。笔者自知水平有限, 本博客的质量无法与专业算法书籍相比。

cjejwe的博客 3611

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

图论系列:图的存储

图的存储方式

weixin_74141526的博客 1457

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

图论——基础概念

图论的基础概念

xzz_0611 的博客 2166

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【算法基础篇】(三十四)图论基础深度解析:从概念到代码,玩转图的存储与遍历

本文系统介绍了图论的基础知识,包括图的基本概念、存储方式和遍历算法。首先讲解了无向图、有向图、简单图、稠密图等基本概念,以及顶点度、路径、连通性等关键特性。接着详细对比了三种图的存储方式:邻接矩阵适合稠密图,vector数组和链式前向星更适合稀疏图。最后深入解析了DFS和BFS两种遍历算法,包括实现代码和应用场景。文章通过生活化类比和C++代码示例,帮助读者从零掌握图论基础知识,为学习更复杂的图算法打下坚实基础。

2301_79248256的博客 3438

图论基础及图的存储

图的最基本概念讲解和图的存储

lcx0128的博客 470

图的基本存储的基本方式三:边集数组

Description 解决图论问题,首先就要思考用什么样的方式存储图。但是小鑫却怎么也弄不明白如何存图才能有利于解决问题。你能帮他解决这个问题么? Input 多组输入,到文件结尾。 每一组第一行有两个数n、m表示n个点,m条有向边。接下来有m行,每行两个数u、v、w代表u到v有一条有向边权值为w。第m+2行有一个数q代表询问次数,接下来q行每行有一个询问,输入一个数为a 注意:点的编号为0~n-1,2<=n<=500000 ,0<=m<=500000,0<=q<=50

K_Programmer的博客 442

图论的存储

写在前面 邻接矩阵 概念 特点 代码 邻接表 概念 特点 代码写在前面图论的存储有好几种 1.邻接表(较普遍) 2.邻接矩阵(最好写) 3.编集数组 4.前向星 但蒟蒻萝卜水平有限,只会前面两种,而且不会STL库,所以。。。邻接矩阵概念用来存储图的二维数组(下标为点编号,数值是权值或边的有无) 特点1.在无向图中往往是沿直线i=j对称。 2.缺点:占用空间

carryt 752

图论之图的存储

本文介绍了图论中常见的四种存储方法:点存储、邻接矩阵、邻接表和链式前向星。重点分析了各方法的优缺点及适用场景,其中邻接表和链式前向星因其高效性最为常用。文章还通过一个具体编程问题展示了链式前向星的实际应用,并对比了各方法的时间/空间复杂度。最后指出链式前向星相比邻接表能提升3-4倍性能,是摆脱STL依赖的更优选择。

qwertqqqppp的博客 377

5.图论.基础1

个人根据代码随想录刷题的思路和笔记整理

weixin_43831098的博客 1497
上一篇: HOJ-1006 - Weird Clock
下一篇: 并查集
Edith_Finch
博客等级 码龄9年 2粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值