链式前向星

由于要带18学弟,所以顺便写一些知识

在图论中建边方法有很多(n是点数,m是边数)

  1. 二维数组,最简单最方便。空间复杂度n2,耗费多少资源就不多说了
  2. Vector,比较简单方便,空间复杂度m,资源没有耗费,但是却有一些耗时,这是由于vector自身的原因(vector初始空间开假设为x,一旦大小超过x,就会申请一个2*x的连续空间,并把之前的数据转移过去,因此会有些耗时)
  3. 链式前向星,稍有难度,空间复杂度m,资源基本没有耗费,时间也比vector

因此以后建图尽量使用链式前向星

链式前向星模板

struct E

{

    int to,next;

}edge[2*MAXN];

int head[MAXN];

int tot;

void add(int x,int y)

{

    edge[tot].to=y;

    edge[tot].next=head[x];

    head[x]=tot++;

}

void init()

{

    memset(head,-1,sizeof(head));

    tot=0;

}

其中head数组是判断每个点是否有边,初始化为-1,代表没有边,否则存储第一个边在

结构体数组中的位置(也是数组下标)

tot是存储已经存储多少条边了,初始化为0,代表没有边

结构体数组中,to代表这条边指向哪里,next代表还有没有边,如果没有就是-1,有的话存储的是下一个边在结构体数组中的位置(也是数组下标)

xy有一条边,则add(x,y),然后把结构体数组tot位置的to设置为ynext指向head[x](也就是之前存过的边,或者是-1)(其实就像链表一样连接起来,add是头插法),然后head[x]=tot++,代表x的第一条边是edge[tot](因为之前第一条存在edge[tot].next里面了),然后tot++代表边数加一

原文地址:https://www.cnblogs.com/lmhyhblog/p/10161547.html