链式前向星 详解

链式前向星 详解链式前向星链式前向星是一种类似于邻接表的存图方式 同样适用于有向图和无向图 他建立的是边与边之间的联系它将边里的所有边都进行编号 intcnt 边的编号 structedge 边的结构体 intfrom to w next from 是边的起点 这个可有可无 因为他可以用 head 数组表示 to 是边的终点

链式前向星

int cnt; //边的编号  struct edge{ 
    //边的结构体 int from,to,w,next; //from是边的起点(这个可有可无,因为他可以用head数组表示) //to是边的终点 w是权值 next表示这条边指向的下一条相同起点的边的编号 }edge[maxn*maxn]; //maxn为图中最大节点编号 int head[maxn]; //head的下标表示节点的编号 存的是以这个节点为起点的添加进来的边的最后一个编号 void init(){ 
    //建图之前一定要初始化!!! memset(head,-1,sizeof(head)); //没有边时为-1 cnt=0; //第一条边编号为0 } void addedge(int u,int v,int w){ 
    //添加边(建图) u是起点 v是终点 w是权值 edge[cnt].from=u;//结构体没定义from这句可以不要 edge[cnt].to=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } int main(){ 
    int m; //边的总数 题中给出边的总数,那用链式前向星就很方便了 int u,v,w; init(); for(int i=1;i<=m;i++){ 
    cin>>u>>v>>w; addedge(u,v,w); } } 

在这里插入图片描述

比如节点1为起点的边有编号分别为1,2,3的边 向节点1插入边1的时候,这时的初始head[1]是等于-1的,然后进行e[1].next=head[1](这时边1的指向-1),然后进行head[1]=1(1为起点的最后一条边为边1,再插入以节点1为起点的边的时候,比如边2,然后进行e[2].next=head[1] (此时的head[1]存的是边1,进行e[2].next=head[1]时边2的指向边1,然后在遍历时的那个i=e[i].next就变成了边2跳向了边1),插入以1为起点的边3时也是如此,边3就指向了边2,head[1]就更新成了3。

因为最后存的是边3,遍历时就是从边3开始,然后指向边2,然后指向边1,然后就指向-1,-1时退出遍历

就这样可以通过对所有节点建边,进行建图

遍历图

for(int i=1;i<=n;i++) //遍历节点1~n for(int j=head[i];~j;j=edge[j].next) //遍历以i为起点的边 ~这个符号,只有当j=-1是,他才等于0,终止循环,也可以用 j!=-1 printf("%d -> %d\n",i,edge[j].to); 

遍历以u为起点的边

for(int i=head[u];~i;i=edge[i].next) printf("%d -> %d\n",u,edge[i].to); 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222320.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午4:03
下一篇 2026年3月17日 下午4:03


相关推荐

  • java常量池和字符串常量池_java声明常量

    java常量池和字符串常量池_java声明常量本篇文章带大家认识Java基础知识——字符串类,在前面我们已经知道如何在Java中定义字符串,本文将介绍Java字符串中的字符串常量池,探究字符串相等问题。

    2022年7月28日
    12
  • 空间统计:Moran’s I(莫兰指数)

    空间统计:Moran’s I(莫兰指数)前两天聊了空间统计学里面的两个经典概念,今天来说说第一篇文章留下的大坑:Moran’sI。首先,Moran’sI这个东西,官方叫做:莫兰指数,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(PatrickAlfredPierceMoran)(好长的名字,不过一般都简称为:帕克·莫兰,就是下图这位中年帅哥了),在1950年提出的。这一年,朝鲜战争爆发。莫兰同学1917…

    2022年6月25日
    86
  • python怎么表示取余_python如何实现取余操作

    python怎么表示取余_python如何实现取余操作python实现取余操作的方法:可以利用求模运算符(%)来实现。求模运算符可以将两个数相除得到其余数。我们还可以使用divmod()函数来实现取余操作,具体方法如:【divmod(10,3)】。在python中要实现取余操作可以使用求模运算符(%),该运算符可以将两个数相除得到其余数。(推荐教程:Python入门教程)如果一个数恰好能被另外一个数据整除,则余数为0,%运算后返回结果为0。可利用余数…

    2022年4月25日
    112
  • 为你的“小龙虾”OpenClaw开发自定义 Skills

    为你的“小龙虾”OpenClaw开发自定义 Skills

    2026年3月16日
    2
  • 【实战】使用讯飞星火API和Python构建一套文本摘要UI程序

    【实战】使用讯飞星火API和Python构建一套文本摘要UI程序

    2026年3月14日
    2
  • 什么是实例化,实例化、声明、初始化的区别

    什么是实例化,实例化、声明、初始化的区别实例化 instantiate 是指在面向对象的编程中 把用类创建对象的过程称为实例化 是将一个抽象的概念类 具体到该类实物的过程 实例化过程中一般由类名对象名 new 类名 参数 1 参数 2 参数 n 构成 简介在面向对象的编程中 通常把用类创建对象的过程称为实例化 其格式如下 如 Datedate newDate 就是用日期类创建了一个日期的对象 就叫对象的实例化

    2025年10月27日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号