邻接表笔记

邻接表

struct edge
{
    int u,v,next;
}e[MAXN];

e d g e edge edge结构体来进行存边, u到v的边,编号为e[i] ,就代表在表e的第i个位置存了可以从点u到点v的边,当然你如果想表示距离的话,不介意再加入一个成员dis,到时候多存一个e[i].dis就好了。

我们还需要再创建一个一维数组head ,一个用作数组下标指针的 i n t int int类型变量js ,且初始化为0

我们用链表来存储每个点的所有出边(点3的出边就是点3为边的开始)。——next的作用:用来指出这个点的上一条边。

例子

假设读入点6的第一条出边,那么我们把 h e a d [ 6 ] head[6] head[6] 的内容指向上述代码中 e e e,中的一个位置,假设为 e [ 8 ] e[8] e[8] ,那么, e [ 8 ] e[8] e[8] 中存有三个成员 u , v , n e x t u,v,next u,v,next ,则此时 u u u就位点6,赋值为6。

假设我们知道这条边到点7 ,则 v v v就存7,

接下来,我们用 e [ 8 ] e[8] e[8] 中的 n e x t next next 来指向点6的一条出边,假设为 e [ 9 ] e[9] e[9], 那么, e [ 8 ] e[8] e[8] 中的 n e x t next next 就为9。

如果没有出边,那么next指向0;

因此,我们初始next全为0。

根据以上例子,我们使用一个函数

void addEdge(int u,int v)
{
    // 将u v这条边记录到e[++js]中
    e[++js].u = u;
    e[js].v = v;
    // 记录uv这条边的上一条出边
    e[js].next = head[u];
    
    // 更新u的上一条出边
    head[u] = js;  // 此时,u的上一条出边变为了js
}

邻接表笔记_第1张图片

(5 7 )是点数量和边数量。

模拟结果如下:
邻接表笔记_第2张图片

我们发现,head[1] 正好指向边3

所以,如果我们想要遍历某个点,比方说 点2 的所有出边,那么我们只需要以下语句:

for(int i = head[2]; i; i = e[i].nxt)

head[2]正好存的就是u = 2 的所有出边的“首个”边,此图中为 4

然后一直找nxt就行。

你可能感兴趣的:(数据结构)