今天终于学会了匈牙利算法,手撕代码的时候却出了问题,难受。链式前向星这种东西大家怎么都知道,就我菜的不知道,更难受了。
从大佬的博客学到了
链式前向星是一种存储图的方法。如果你需要一个有序的边序列,如果排序的话用快拍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;
}
其实就是刚开始想不太明白,模拟一遍就很简单了。什么?
你懒得弄?
那就跟我来吧!
数学序号代表添加顺序
首先把数组什么的初始化;
添加第一条边:
添加第二条边:
添加第三条边:
添加第四条边
添加第五条边:
添加第六条边:
现在就显而易见了,head[i]存的是上一条以i为起点的边在edge数组中的位置。