有关树的经常需要存图,vector数组比较方便,不过有些题卡stl,就很容易T。所以链式向前星就非常重要了。
这几天能不用链式向前星就不用,因为不会用...这当然是不可取的。想起来初中老班的一句话,出来混迟早是要还的,所以问题不解决迟早是要栽坑的。昨天遇见dfs序时不太会模拟,因为对出栈的点的顺序理解的不是很通透,全套板子。一步一步稳着来,zkw冲呀
含义:
链式向前星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并用head[ ]记录下以某个点为起点的所有边在数组中的起始位置。换句话来理解它其实就是有n链表,每条链表存的是所有相同结点的边。
edge[i].to:第i条边的终点,即这条边指向哪个点
edge[i].nxt:与i同起点的下一条边的存储位置
edge[i].val:边权
head[i]:以第i为初始结点的边的序号,其实在以i为起点的所有边的最后输入的那个编号
理解:
用图表示:
板子:
int head[maxn]; //记得初始化为-1
int cnt = 0;
struct node {
int to;
int nxt;
int val;
}edge[maxn]; //若建立双向边的话,maxn需要*2
void add(int a,int b,int val) {
edge[cnt].to = b;
edge[cnt].nxt = head[a];
edge[cnt].val = val;
head[a] = cnt++;
}
//遍历起点为x的链表
for(int i = head[x]; i!=-1; i=node[i].nxt) {
}