参考:https://blog.csdn.net/deritt/article/details/50640997

先放写法,再看例子就懂了

首先我们需要定义一个数组 head[]

int head[maxn];
//head[i]表示节点i所连的最后一条边的编号(这里的最后指输入数据中最后加进来的边)

其次需要定义一个结构体来存贮边的信息

struct node{int v,w,next;
}edge[maxn*2];//此处的edge表示的是某一条边的信息
//edge[i].v表示编号为i的边是一条指向节点v的边
//edge[i].w表示编号为i的边所带有的权值
//edge[i].next

edge[i].next文字描述相当麻烦,用图表示如下

我们可以看到x,y,z为边的编号,u,v1,v2,v3为点的编号,那么

edge[z].next=y;
edge[y].next=x;

也就是说假如编号为i的边表示从一条从u指向v的边,那么edge[i].next就表示按加边顺序来说上一条从u发出的边

接下来要进行加边的操作【头插法】,理解头插法就明白邻接表写法的一大半了

int tot;void addedge(int ui,int vi,int wi)//表示建ui与vi之间的双向边
{//建从u指向v的边 edge[tot++].v=vi;edge[tot].w=wi;edge[tot].next=head[ui];head[ui]=tot;//建从v指向u的边 edge[tot++].v=ui;edge[tot].w=wi;edge[tot].next=head[vi];head[vi]=tot;
}

若要查询与节点x所连的所有节点(或边)那么

    for (int i=head[x];i!=0;i=edge[i].next)int vv=edge[i].v;//vv为x所连的节点 

若要遍历整个图则

int n,m,flag[maxn];
void dfs(int x)//遍历整个图
{for (int i=head[x];i!=0;i=edge[i].next){int vv=edge[i].v;if (flag[vv]!=1)//没被访问过 {flag[vv]=1; dfs(vv);}}
}

例子:

走一下过程,就明白了:(head初始为0)

A->D:  edge[1]:【to=D,val=权值[忽略],next=0】 head[A]=1;

A->B: edge[2]: 【to=B,val=权值[忽略],next=1】 head[A]=2;

此时相遍历A的相邻节点:

for(int i=head[A];i;i=edge[i],next)

不就是i=head[A]=2;

i=edge[2].next=1【A->D】

i=edge[1].next=0 此时不满足for循环条件,退出循环

完事

邻接表终极解析===和vector写法的区别相关推荐

  1. 【邻接表存图模板】vector邻接表、数组邻接表、链式前向星

    一.目录 一.目录 二.前言 三.邻接表"详解" (一)边的信息 (二)几种邻接表的实现方法"详解" 1.数组邻接表 代码 2.vector邻接表 代码 vec ...

  2. 邻接矩阵和邻接表_[力扣743] 带权邻接表的单源最短路

    题目链接 743. 网络延迟时间 题目描述 有 N 个网络节点,标记为 1 到 N. 给定一个列表 times,表示信号经过有向边的传递时间. times[i] = (u, v, w),其中 u 是源 ...

  3. dijkstra邻接表_[力扣743] 带权邻接表的单源最短路

    题目链接 743. 网络延迟时间 题目描述 有 N 个网络节点,标记为 1 到 N. 给定一个列表 times,表示信号经过有向边的传递时间. times[i] = (u, v, w),其中 u 是源 ...

  4. 链式前向星与邻接表对比

    本文图片及数据 对于这样一张有向图: 输入边的顺序如下: 1 2 2 3 3 4 1 3 4 1 1 5 4 5 对于邻接表来说是这样的: 1 -> 2 -> 3 -> 5 2 -& ...

  5. 4003基于邻接表的新顶点的增加(C++,附详细解析)

    描述 给定一个无向图,在此无向图中增加一个新顶点. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的 ...

  6. 图的存储--邻接矩阵和邻接表(链表实现和用vector实现)

    邻接矩阵: #include<iostream> #include<vector> #include<iomanip> #include<string> ...

  7. PTA 旅游规划(邻接表) 思路分析及代码解析

    PTA 旅游规划_使用邻接表 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...

  8. 图的链式存储结构解析(邻接表、逆邻接表、十字链表、邻接多重表)

    图的矩阵表示法比较消耗空间,需要花费$ n 2 n^2 n2$个单元存储边(弧).在边数较少的情况下比较浪费.我们这里来讨论图的链式存储结构. 图的链式结构主要有四类:邻接表.逆邻接表.十字链表.邻接 ...

  9. 链式前向星核心代码解析 ← 数组模拟邻接表

    [知识点] 在图论算法实现中,常使用C++标准库STL自带的vector来模拟邻接表存图.详见: https://blog.csdn.net/hnjzsyjyj/article/details/101 ...

最新文章

  1. arm7 mysql 编译安装_uboot的readme导读(转)
  2. 带宽测量:pathload编译及运行
  3. getline没有与参数列表匹配的重载函数_C++新增基础功能解析—函数重载功能的使用...
  4. Linux 6.5选包截图
  5. 使用节点或Express返回JSON的正确方法
  6. css-使不同大小的图片在固定大小的容器中居中
  7. android SpannableString使用详解
  8. IOS之Core Foundation框架和Cocoa Foundation框架的区别
  9. AppLinks使用详解
  10. android 位移传感器 坐标,鼠标的工作原理及位移测量的实现方法
  11. matlab转换器dcdc,用 Simulink 设计 DC/DC 转换器
  12. webpack 图像压缩_基于webpack的图片压缩最佳方案
  13. 微软同步工具之synctoy
  14. 软文成功案例,给企业带来的价值不可限量
  15. 【Python讲义】WEEK 8
  16. 表示学习(特征学习)
  17. 网页轮播图(详细版)
  18. 前端和后端分别做什么?
  19. AI中的变形,扭曲和变化,栅格化命令,裁剪标记,路径,路径查找器,转化为形状
  20. untrusted Developer You can allow using these apps in settings you can allow using these apps i

热门文章

  1. 拿haojava官方过程
  2. EF Code First执行SQL语句及存储过程
  3. Robocopy.exe使用详例
  4. glibc和ulibc的区别
  5. 计算机维护系统Win8PE,u启动windows8PE工具箱
  6. centos7配置 console口_centos7基本配置
  7. 一文搞懂结构体的定义及实际使用
  8. 发文件服务器空间满,针对服务器储存空间爆满而引发的宕机问题的解决方案
  9. 【Java】多线程编程(并发编程)基础(上)
  10. Flask-Login一些使用解释(根据官网和个人查找资料的理解并解释)