邻接表与前向星

18 篇文章 0 订阅
6 篇文章 0 订阅
写在前面的话:acdreamers的BLOG给了本文很大启发。
  • 由于在明白了二者的写法之后,发现选择一个掌握就可以了,故只写出了邻接表的模板。

前向星(存边):

  • 原理:将所有边按照先起点后终点的顺序从小到大排序。
  • 记录:对所有点,记录以某点为起点的所有边在 EDGE 数组中的起始位置:head[maxn],与长度(以该点为起点的边的个数):len[maxn]
  • 局限:排序操作耗时,故使用链式前向星改进。

链式前向星:

struct EDGE{
	int to;
	int w;
	int next;//下一个共首边的id
};
int cnt;//记录边数,用于加边
int head[maxn];//head[i]表示最后一个以i为起点的边的id

邻接表:

  • 模板(顺序存边):
struct EDGE{
	int to;
	int w;
	int fo;//former
};
EDGE E[num];int cnt;//边数
int tail[maxn];//点数
void INIT(){
	memset(tail,-1,sizeof(tail));
	cnt = 0;
	return ;
}
void ADDEDGE(int u,int v,int w){
	cnt++;//from 1 ... cnt
	E[cnt].to = v;
	E[cnt].w = w;
	E[cnt].fo = tail[u];
	tail[u] = cnt;
	return ;
}
//遍历所有边:
for(int i=1;i<=N;i++){//N为点数
	for(int j=tail[i];~j;j=E[j].fo){
		//...
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值