由于要带18学弟,所以顺便写一些知识
在图论中建边方法有很多(n是点数,m是边数)
- 二维数组,最简单最方便。空间复杂度n2,耗费多少资源就不多说了
- Vector,比较简单方便,空间复杂度m,资源没有耗费,但是却有一些耗时,这是由于vector自身的原因(vector初始空间开假设为x,一旦大小超过x,就会申请一个2*x的连续空间,并把之前的数据转移过去,因此会有些耗时)
- 链式前向星,稍有难度,空间复杂度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,有的话存储的是下一个边在结构体数组中的位置(也是数组下标)
若x向y有一条边,则add(x,y),然后把结构体数组tot位置的to设置为y,next指向head[x](也就是之前存过的边,或者是-1)(其实就像链表一样连接起来,add是头插法),然后head[x]=tot++,代表x的第一条边是edge[tot](因为之前第一条存在edge[tot].next里面了),然后tot++代表边数加一