一、目录
二、前言
本来之前自己太弱了,一直只会用邻接矩阵,后来发现邻接表才是主流...
参考&特别鸣谢:
https://www.cnblogs.com/dilthey/p/9016321.html
https://www.cnblogs.com/ECJTUACM-873284962/p/6905416.html
三、邻接表“详解”
专业邻接表知识许多博客和书上都阐述得很详尽了,
自己这里只是简单地解析,可能用语不太准确,主要目的是用自己懂的方式解释一下
(一)边的信息
1.对于每条边而言:
一般做题时题目会提供很多关于每条边的信息,如边权、点权,这时我们要把需要的信息存下来
一般有三个:u—边的起始端点、v—边的终止端点、w—边权or长度,
常规用结构体储存:
struct edge
{
int u,v,w;
edge(int _u=0,int _v=0,int _w=0){u=_u,v=_v,w=_w;}
//edge(edge &e){u=e.u,v=e.v,w=e.w;}
};
2.对于整个图而言:
知道了每条边的信息,还要把它们按照题目所给的关系连起来,组成一个完整的图
对于每条边,想要让它和其他边连起来,肯定会想到一个关键信息:
next / to——该边与之相连的边的编号
这部分就会涉及到不同的实现方法了,方法不同,关键信息也不同
(二)几种邻接表的实现方法“详解”
1.数组邻接表
第一行两个整数n m。n表示顶点个数(顶点编号为1~n),m表示边的条数。接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z。下图就是一种使用链表来实现邻接表的方法。
上面这种实现方法为图中的每一个顶点(左边部分)都建立了一个单链表(右边部分)。这样我们就可以通过遍历每个顶点的链表,从而得到该顶点所有的边了。使用链表来实现邻接表对于痛恨指针的的朋友来说&#