一、结构体类型存储
struct E
{
int to,w,nex;
} edge[N*2];
int tot,head[N];
遍历
for(int i=head[u],~i,i=edge[i].nex) //u节点都指向了谁(无边,边权为-1)
{
int v=edge[i].to,w=edge[i].w;//这条边指向了谁+边权
......
}
void add(int u,int v,int w)
{
edge[tot].to=v;//终点
edge[tot].w=w;//边权
edge[tot].next=head[u];//下一个起点,也就是上一个终点
head[u]=tot++;//循环往复
}
ps:
1.前三句是相当于链表的初始化 (空节点)
2.前三句+最后一句相当于链表的插入操作
二、数组模拟类存储
int he[N],tot;
int to[N*2],nex[N*2],w[N*2];
void add(int u,int v,int z)//创建邻接表+加边
{
to[tot]=v;
w[tot]=z;
nex[tot]=he[u];
he[u]=tot++;
}
void bianli(int u,int father,int sum)
{
for(int i=he[u];~i;i=nex[i])
{
int j=to[i],ww=w[i];
......
}
}