链式前向星(听都没听过)

今天终于学会了匈牙利算法,手撕代码的时候却出了问题,难受。链式前向星这种东西大家怎么都知道,就我菜的不知道,更难受了。
从大佬的博客学到了
链式前向星是一种存储图的方法。如果你需要一个有序的边序列,如果排序的话用快拍O(nlogn),而链式前向星可以避免这种排序。但是数据规模较小时速度比不上邻接矩阵。
如果说邻接表是不好写但效率好,邻接矩阵是好写但效率低的话,前向星。前向星固然好些,但效率并不高。而在优化为链式前向星后,效率也得到了较大的提升。虽然说,世界上对链式前向星的使用并不是很广泛,但在不愿意写复杂的邻接表的情况下,链式前向星也是一个很优秀的数据结构。
具体数据结构:
链式前向星最强的地方在于head数组和nxt;

struct edge
{
     int nxt;
     int to;
     int w;
}E[maxn];

其中edge[i].to表示第i条边的终点,edge[i].next表示与第i条边同起点的下一条边的存储位置,edge[i].w为边权值.
另外还有一个数组head[],它是用来表示以i为起点的第一条边存储的位置,实际上你会发现这里的第一条边存储的位置其实
在以i为起点的所有边的最后输入的那个编号.
head[]数组一般初始化为-1

添加变得操作

void add(int u,int v,int w)//添加单向边
{
    edge[cnt].w = w;
    edge[cnt].to = v;
    edge[cnt].next = head[u];
    head[u] = cnt++;
}

遍历以u为起点的所有边:

for(int i=head[u];~i;i=edge[i].nxt)
{
    int v=edge[i].to;
}

其实就是刚开始想不太明白,模拟一遍就很简单了。什么?
你懒得弄?
那就跟我来吧!
ACMer小城
数学序号代表添加顺序
首先把数组什么的初始化;

添加第一条边:
添加第一条边
添加第二条边:
这里写图片描述
添加第三条边:
这里写图片描述
添加第四条边
这里写图片描述
添加第五条边:
这里写图片描述
添加第六条边:
这里写图片描述
现在就显而易见了,head[i]存的是上一条以i为起点的边在edge数组中的位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值