链式前向星模板
//前置条件
const int N=105;
int hd[N],cnt=0;
struct Edge {
int to,val,nxt;
}e[N*N];
//链式前向星
void build(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].val=w;
e[cnt].nxt=hd[u];
hd[u]=cnt;
}
下面以简易的 D A G DAG DAG 图举例(三点三边)
![](https://i-blog.csdnimg.cn/blog_migrate/85774d2b900490c522bbc7545607d5e6.png)
//建图
for(int i=0;i<3;++i)
{
int u,v,w;
cin>>u>>v>>w;
build(u,v,w);
}
//遍历以 u节点为起始位置的所有边
for(int u=1;u<=3;++u)
{
for(int i=hd[u];i;i=e[i].nxt)
{
cout<<u<<' '<<e[i].to<<' '<<e[i].val<<endl;
}
}
input:
1 2 3
1 3 6
2 3 9
output:
1 3 6
1 2 3
2 3 9
详解
结构体
E
d
g
e
Edge
Edge 中的 to、val、nxt 和 head 的含义如下
to
:箭头指向的节点
val
:边上的权值
nxt
:该节点(u)上一次指向边的编号,若没有上一次指向边则为 0
hd
:当前边的编号
cnt 代表每条边的编号,从下标 1 开始,所以当 nxt 为 0 时,即该节点(u)目前没有指向过任意一条边
hd
(head)和 nxt
(next)都是储存边的编号,因此遍历也是按照点对应的边来遍历
第一重循环,循环所有节点,也就是将每个节点作都为 u,寻找其指向边
第二重循环,hd[u]
保存的是节点 u 所有指向边中最后一条边(编号最大)的编号,ed[hd[u]].nxt
表示当前节点的上一次指向边的编号,若是 0 则已经全部遍历完了(停止遍历)