链式前向星

一种特殊的存边方式

存储结构

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){          //除去父亲
		
	}
}
posted @ 2024-08-04 15:34  Z-kazuha  阅读(7)  评论(0编辑  收藏  举报
/* 鼠标点击求赞文字特效 */