链式前向星

什么是链式前向星

链式前向星(Chained Forward Star)是一种用于表示稀疏图的数据结构。它主要用于解决图论中的一些算法问题,如最短路径、最小生成树等。

链式前向星通过两个数组来表示图的边和顶点信息:

  1. 边数组(Edge Array):存储了每条边的相关信息,如起点、终点、权重等。
  2. 下一个边数组(Next Edge Array):存储了每个顶点的第一条出发边的索引值,通过这个数组可以找到下一条以同一起点的边。

链式前向星的优势在于它能够高效地处理稀疏图,节省了存储空间,并且能够在常数时间内访问某个顶点的所有出发边

在我看来:链式前向星其实就是链表写法的邻接表改成数组来实现,不直接使用指针,用数组下标间接代替指针的作用
参考了链表头插法实现邻接表的思路:
1.链表中每插入一个边,是采用头插的方法,这里的思路也是头插;(第一条输入的边它的next指向就是-1,输入边的信息时它前面没有,输出时他后面也不再有边)
2.链表访问的结尾采用的是NULL,这里采用的是-1

struct edge {int to; // 边的终点int nextt; // 指向下一条边的指针int wei; // 边的权重
} edge[MAX_M]; // 存储边的数组// 添加无向边到邻接表
void addedge(int x, int y, int z) {edge[++cnt].to = y; // 边的终点edge[cnt].wei = z; // 边的权重edge[cnt].nextt = head[x]; // 将当前边指向x节点的下一条边head[x] = cnt; // 更新x节点的头结点指针  cnt表示第几条边
}

在储存图结构时我们经常会用到链式前向星. 

首先在我看来它的思想像链表,只不过它是从头部插入. 我们创建一个edge的结构体,用来存储边

edge.w——权重

edge.to——这条边的终点

edge.next——它指向同一起点的上一条边,edge[MAX_M]中的下标,一个下表代表一条边

下面应该是大多数人不理解的点cnt,head数组???这个点我也是困惑了许久

讲解:1.cnt表示用来记算,表示这是第几条边   2.head数组这个表示插入的新的一条边

如head[1]=(cnt)4,指向表示以1为起点edge[4]这条边,而其他的先加入以1为起点的边就拍在了edge[4]这条边的后面去了.也就是像以一个起点建立一个链表,只不过后来加进来的边就是在头部

下面还是给道例题

P3371 【模板】单源最短路径(弱化版)

 题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

 输入格式

第一行包含三个整数 n,m,s,分别表示点的个数、有向边的个数、出发点的编号。

接下来 m 行每行包含三个整数 u,v,w,表示一条 u \to v 的,长度为 w的边。

输出格式

输出一行 n 个整数,第 i 个表示s 到第 i 个点的最短路径,若不能到达则输出 -1。

#include <stdio.h>#define MAX_N 100000
#define MAX_M 1000000
#define INF 2147483647int head[MAX_N], cnt; // 邻接表头结点数组和计数器
long long ans[MAX_M]; // 存储最短路径的数组
int vis[MAX_N]; // 记录节点是否被访问的数组struct edge {int to; // 边的终点int nextt; // 指向下一条边的指针int wei; // 边的权重
} edge[MAX_M]; // 存储边的数组// 添加无向边到邻接表
void addedge(int x, int y, int z) {edge[++cnt].to = y; // 边的终点edge[cnt].wei = z; // 边的权重edge[cnt].nextt = head[x]; // 将当前边指向x节点的下一条边head[x] = cnt; // 更新x节点的头结点指针  cnt表示第几条边
}int main() {int m, n, s;scanf("%d %d %d", &m, &n, &s); // 输入节点数、边数、起始节点for (int i = 1; i <= n; i++) {ans[i] = INF; // 初始化最短路径数组为无穷大}ans[s] = 0; // 起始节点到自身的最短路径为0for (int i = 1; i <= n; i++) {int a, b, c;scanf("%d %d %d", &a, &b, &c); // 输入边的起点、终点和权重addedge(a, b, c); // 添加边到邻接表}int pos = s; // 当前节点为起始节点while (!vis[pos]) { // 当前节点未被访问long long minn = INF; // 最小路径初始化为无穷大vis[pos] = 1; // 将当前节点标记为已访问for (int i = head[pos]; i != 0; i = edge[i].nextt) { // 遍历当前节点的邻接边if (!vis[edge[i].to] && ans[edge[i].to] > ans[pos] + edge[i].wei) { // 如果邻接节点未被访问且路径更短ans[edge[i].to] = ans[pos] + edge[i].wei; // 更新最短路径}}for (int i = 1; i <= m; i++) { // 寻找未访问节点中最小路径的节点作为下一个节点if (ans[i] < minn && !vis[i]) {minn = ans[i];pos = i;}}}for (int i = 1; i <= m; i++) {printf("%lld ", ans[i]); // 输出最短路径数组}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Anaconda下的pkgs占用空间13G,如何安全的清理(已解决)

方法一&#xff1a;让Anaconda自行决定清理 执行命令 conda clean -p 我的Anaconda安装在D盘&#xff0c;具体位置如下。你的应该也能找到对应的位置 D:\*****\**\Anaconda3\pkgs (base) C:\Users\Liu_J>conda clean -p WARNING: C:\Users\***\.conda\pkgs does not ex…

haproxy集成国密ssl功能

1. 概述 1.1 缘起 haproxy作为开源高性能http/tcp代理服务器得到了广泛应用,它可以支持国际ssl加密通信功能,但是对于国密ssl却一直没有被官方得到支持。随着国密标准规范的推广应用,以及等保2.0明确规定要求对网络通信中的报文或会话过程全文加密(三级),这样导致在haprox…

Conda管理Python不同版本教程

Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda设置国内源&#xff08;以添加清华源为例&#xff0c;阿里云源同样&#xff09; 3.conda管理python库 4.其它 不太推荐 pyenv管理Python不同版本教程&#xff08;本人另一篇博客&#xff0c;姊妹篇&…

C语言菜鸟入门·数组简介

目录 1. 简介 2. 声明数组 3. 初始化数组 3. 访问数组元素 4. 获取数组长度 5. 数组名 1. 简介 在 C 语言中&#xff0c;数组是一种用来存储相同类型数据元素的集合。数组提供了一种便捷的方式来管理一系列相同类型的数据&#xff0c;可以按照索引来访问和操作数组…

netty的TCP服务端和客户端实现

第一步&#xff1a;引入依赖 <dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.90.Final</version></dependency></dependencies> 第二步&#xff1a;实…

探究网络工具nc(netcat)的使用方法及安装步骤

目录 &#x1f436;1. 什么是nc&#xff08;netcat&#xff09;&#xff1f; &#x1f436;2. nc&#xff08;netcat&#xff09;的基本使用方法 2.1 &#x1f959;使用 nc 进行端口监听 2.2 &#x1f959;使用 nc 进行端口扫描 2.3 &#x1f959;使用 Netcat 进行文件传输…

代码随想录算法训练营day20

题目&#xff1a;530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先 参考链接&#xff1a;代码随想录 530.二叉搜索树的最小绝对差 思路&#xff1a;我一开始想到的方法是先生成中序序列&#xff0c;然后对相邻两项的差进行计算&#xff0c;取…

【PCIE709-F】基于复旦微JFM7VX690T80 FPGA的全国产化8通道光纤双FMC接口数据处理平台

板卡概述 PCIE709-F是一款基于上海复旦微电子的28nm 7系列FPGA JFM7VX690T80的全国产化8通道光纤双FMC接口数据预处理平台&#xff0c;该板卡采用复旦微的高性能7系列FPGA作为实时处理器&#xff0c;实现4路10G SFP光纤以及1路QSFP通信接口、实现1路X8 PCIE数据传输的功能。板载…

Go 1.22 对 net/http 包的路由增强功能详解

目录 方法匹配&#xff08;Method Matching&#xff09; 通配符&#xff08;Wildcards&#xff09; 路径前缀匹配 优先规则 兼容性 API 变更 小结 参考资料 Go 1.22 版本对 net/http 包的路由功能进行了增强&#xff0c;引入了方法匹配&#xff08;method matching&…

【鸿蒙系统学习笔记】网络请求

一、介绍 资料来自官网&#xff1a;文档中心 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 日常…

SpringMVC回顾总结笔记

MVC是一种思想而SpringMVC是具体的实现&#xff08;Ioc和DI的关系&#xff09; 在创建项目的时候勾选的SpringWeb框架就是SpringMVC框架 与浏览器建立连接 默认返回的是一个 view 视图。需要添加ResponseBody说明返回的是json数据。RestController是ControllerResponseBody…

fastJSON 字符串转对象

一、fastJSON 包 dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.33</version> </dependency> 二、转普通对象 自定义对象A A aa JSONObject.parseObject("字符串", A.…

【数据结构】_队列

目录 1.概念 2.队列的使用 3.队列模拟实现 4.循环队列 5.双端队列 6.栈与队列的互相实现 6.1 用队列实现栈 6.2 用栈实现队列 1.概念 &#xff08;1&#xff09;队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff1b; &am…

小米标准模组+MCU 快速上手开发(一)——之固件下载

小米标准模组+MCU 开发笔记之固件下载 背景技术名词简介● 小米IoT开发者平台● 小米IoT 模组● ESP系列简介问题描述 + 解决方式问题1:固件下载是否有示例,如何下载到硬件板卡中?问题2:固件下载的官方程序是什么?在哪里?该如何使用?问题3:固件下载时,Flash和Ram 有什…

CSB ---> (XXE)XML基础

本来今天想更一下CSbeacon上线多层的内网机器的&#xff0c;但是刚好今天是年后的第一节课&#xff0c;讲的是XXE的基础&#xff0c;那就来先盘一下基础&#xff01;&#xff01; 1.XXE XXE全称是XML External Entity即xml外部实体注入攻击&#xff01;其后果会导致用户…

Linux eject命令教程:如何控制可移动介质的弹出和收回(附案例详解和注意事项)

Linux eject命令介绍 eject命令在Linux中用于弹出可移动介质&#xff0c;通常是CD-ROM、软盘、磁带或JAZ或ZIP磁盘。您还可以使用此命令来控制一些多盘CD-ROM切换器&#xff0c;一些设备支持的自动弹出功能&#xff0c;以及关闭一些CD-ROM驱动器的光盘托盘。 Linux eject命令…

【VIP专属】Python应用案例——基于Flask框架的图像识别小程序

目录 一、项目需求: 二、编译环境: 三、项目结构: 四、功能演示: 1、程序首页面 2、上传图片

[bing]“gang调度 Kubernetes的并发控制和一致性机制“论点的对应的源码分析

你是一位K8S专家。请分析在Kubernates&#xff08;https://github.com/kubernetes/kubernetes.git&#xff09;项目和调度coscheduling(https://github.com/kubernetes-sigs/scheduler-plugins/tree/master/pkg/coscheduling) 插件中支撑"PodGroup的管理和调度决策涉及到对…

【Docker】基于yum安装docker

之前的Linux虚拟机不用了&#xff0c;所以需要重新安装一下docker。这次使用基于yum的方式安装docker&#xff0c;docker可以方便我后续快速部署其他中间件实例。 安装过程[2]如下&#xff1a; # 1、yum 包更新到最新 yum update# 2、安装需要的软件包&#xff0c; yum-util…

MySQL物理拷贝一张Innodb表的方法

在 MySQL 中&#xff0c;物理拷贝表是一个相对复杂的过程&#xff0c;尤其是与逻辑导出&#xff08;如使用 mysqldump 或导出 CSV 文件&#xff09;相比。这个过程涉及直接操作数据库文件&#xff0c;因此需要格外小心。 物理拷贝表的具体步骤&#xff1a; 1、创建相同结构的…