链式前向星

链式前向星模板

//前置条件
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 图举例(三点三边)

//建图
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、nxthead 的含义如下
to:箭头指向的节点
val:边上的权值
nxt:该节点(u)上一次指向边的编号,若没有上一次指向边则为 0
hd:当前边的编号

cnt 代表每条边的编号,从下标 1 开始,所以当 nxt 为 0 时,即该节点(u)目前没有指向过任意一条边

hdhead)和 nxtnext)都是储存边的编号,因此遍历也是按照点对应的边来遍历
第一重循环,循环所有节点,也就是将每个节点作都为 u,寻找其指向边
第二重循环hd[u] 保存的是节点 u 所有指向边中最后一条边(编号最大)的编号,ed[hd[u]].nxt 表示当前节点的上一次指向边的编号,若是 0 则已经全部遍历完了(停止遍历)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值