一种特殊的存边方式
存储结构
int cnt;
struct node{
int to,nxt,w;
}e[N*2];
int head[N*2];
cnt : 边的编号
e[cnt].to : 边的终点
e[cnt].nxt : 与此边同一起点的下一个边的编号
w : 边权
head[u] : 以u为起点的第一条边的编号
N*2 : 双向建边
(不懂可以往下看看加边代码)
初始化
for(int i=0;i<N*2;i++){
e[i].nxt=-1;
head[i]=-1;
}
加边
void add(int u,int v,int w){
e[cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt++;
}
这里的加边过程会与上面的定义不符:
e[cnt].nxt : 与此边同一起点的上一个边的编号
head[u] : 以u为起点的最后一条边的编号
但正序和倒序对结果并无影响
遍历
for(int i=head[u];~i;i=e[i].nxt){ //遍历节点i的所有儿子 ~i 可写作 i!=1
if(e[i].to!=father){ //除去父亲
}
}
标签:nxt,cnt,int,编号,head,链式,加边,前向星
From: https://www.cnblogs.com/ZZ-nyn/p/18341758