首页 > 编程知识 正文

链式排序图解,链式基数排序图解

时间:2023-05-05 03:20:31 阅读:17663 作者:1460

图的记忆方法很多,最常见的除了邻接矩阵、邻接表、边集排列外,还有链式前星。 链式前向星是静态链表存储,通过边集数组和邻表的组合,可以快速访问一个顶点的所有邻点,在算法竞赛中得到了广泛的应用。

链式前向星存储有两种结构:

边缘集数组: edge[ ],edge[i]表示第I条边缘; 头节点数组: head[ ],head[i]中包含以I为起点的第一边的下标(edge[]中的下标) struct node{ int to,next,w; }edge[maxe]; //边集数组,边数通常设置为大于maxn*maxn的数,如有主题要求,则int head[maxn]; //标题节点数组的各边的结构如图所示。

例如,如图所示的无向图。

按以下顺序输入每条边的两端,创建链式前向星: 步骤如下。

如图所示,输入1 2 5创建边1-2,权重为5,创建第一条边edge[0]。

然后,将该边链接到第一节点的头节点。 (初始时head[]数组全部初始化为-1。)

即,edge[0].next=head[1]; head[1]=0; 如图所示,指示与第一个节点相关联的第一条边是第0条边。 图中的虚线箭头只是表示他们之间的链接关系,不是指针。

因为是无向图,所以还需要追加其另一边、2-1、权重5。 创建第二条边edge[1],如下图所示。

然后,将该边链接到第二节点的头节点。

即edge[1].next=head[2]; head[2]=1; 如图所示,指示与第二个节点相关联的第一边是第一边。

如图所示,输入1(4)创建边1-4,权重为3,创建第三条边edge[2]。

然后,将该边链接到1号节点的头节点〔头插法〕。

即,edge[2].next=head[1]; head[1]=2; 如图所示,指示与第一个节点关联的第一条边是第二条边。

因为是无向图,所以还需要追加其另一边、4-1、权重3。 创建第四条边edge[3],如图所示。

然后,将该边链接到4号节点的头节点。

即,edge[3].next=head[4]; head[4]=3; 如图所示,指示与第四个节点关联的第一条边是第三条边。

依次输入以下三条边,如图所示创建链式前星。 2 3 8

2 4 12

3 4 9

添加边缘u v w的代码如下。

voidadd(intu,int v,int w )//边缘edge[cnt].to=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt; }如果是有向图,则每次输入边缘时执行add(u、v、w )即可。 对于有向图,必须运行两次add(u、v、w )。 添加(v,u,w )。

http://www.Sina.com/http://www.Sina.com /

for(intI=head[u]; I!=-1; I=edge [ I ].next ({ intv=edge [ I ].to; //u的邻接点int w=edge[i].w; //u—v的权重…} 如何使用链式前向星访问一个结点u

和旁边的表一样,因为用头插管法链接,所以边的输入顺序不同,制作的链式前星也不同。 对于有向图,每次输入一条边时,必须添加两条边,使它们相互反向。 例如,如图所示,如果输入第一条边1、2和5,实际上会添加两条边。

这两条边是相互反向的边,通过与1的异或运算可以得到其反向的边,为0 ^1=1,1 ^1=0。 也就是说,一边的下标为I的话,其相反一侧的边为i^1。 这个特性在网络流中非常有用。

3 .链式前向星具有边集数组和邻表功能,属于静态链表,不需要频繁节点,应用非常灵活。

的所有邻接点呢?

#includeiostream//创建无定向网络的链式前向明星# includecstringusingnamespacestd; 常数int maxn=100000 5; int maxx[maxn],head[maxn]; int n,m,x,y,w,cnt; 结构边缘{ int to,w,next; (}e[maxn]; voidadd(intu,int v,int w ) ) /边u--v e[cnt].to=v; e[cnt].w=w; e[cnt].next=head[u]; head[u]=cnt; ) } void printg () /链式前向星cout )---------链式前向星如下: ----------'endl; for(intv=1; v=n; v ) ({coutv ):); for(intI=head[v]; ~i; I=e[I].next]{intV1=e[I].to,w1=e[i].w; cout'['v1' 'w1']t '; }coutendl; }}int main () {cinnm; memset (头,-1,sizeof ) ) head ); cnt=0; for(intI=1; i=m; I ) {cinxyw; 添加(x,y,w ); //添加边add(y,x,w ); //添加翻转边}printg (; 返回0; (/*输入示例4 51 2 51 4 32 3 82 4 123 4 9*/) /

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。