前向星

前向星(Forward Star) 前向星是以储存边的方式来存储图的数据结构。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序,如下面例程),前向星就构造完了。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。前向星的时间复杂度为O(m),m为边数。总体时间并不会逊色于邻接表。 阅读详情

理解前向星

定义:
参照来源: (https://blog.youkuaiyun.com/acdreamers/article/details/16902023)
前向星:

  1. 对所有输入的边的集合,进行排序。 按照起点、终点、权值进行排序
  2. 需要保存边的开始位置、其实位置、权重
  3. head[i]: 以i为起点的边在已经排好序的边集数组中的位置
  4. len[i]: 以i为起点的边的个数

重新思考前向星后的理解

  • 前向星主要是和邻接表一样,用来保存每个节点后面有多少条边,并记录下个数以及该节点在边集数组中的位置
  • 边集数组:数据保存的时候是在一个数组中,所以在数组中是有位置的,排好序之后,位置更加明显
  • 举例说明:
5 7
1 2 1
2 3 2
3 4 3
4 1 5
1 5 6
4 5 7
1 3 4
head: 1 len = 3
1 2 1
1 3 4
1 5 6
head: 4 len = 1
2 3 2
head: 5 len = 1
3 4 3
head: 6 len = 2
4 1 5
4 5 7
  • 其中可以看见,只要排好序之后,节点有点的边数就是依次对应的
  • 所以head[i]表示的就是当前节点在排好数组中的位置在哪里,如果为-1就表示当前节点是没有的子节点的
  • len[i]表示当前节点的子节点的个数有多少个
  • 和邻接表是类似的,不过呢其中是需要排序的,所以时间复杂度是nlogn
  • 可以对sort进行重载小于号,全局模式进行排序,也是可以的
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

//所谓前向星的租用就是记录好从某个起点开始的边的个数
//因为所有的都是在数组中,所以需要记录好这条边在数组中的位置是哪里,以及这条边的长度,
const int maxn = 10000;
struct Edge
{
    int u, v, w;
    friend bool operator<(const Edge &E1, const Edge &E2);
} e[maxn];
bool operator<(const Edge &E1, const Edge &E2)
{
    if (E1.u != E2.u)
        return E1.u < E2.u;
    else if (E1.v != E2.v)
        return E1.v < E2.v;
    else
        return E1.w < E2.w;
}
int head[maxn], len[maxn];
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        cin >> e[i].u >> e[i].v >> e[i].w;
        len[e[i].u]++;
    }
    sort(e + 1, e + 1 + m);
    memset(head, -1, sizeof(head));
    //最开始的起点一定是编号为1的
    head[e[1].u] = 1;
    for (int j = 2; j <= m; j++)
        if (e[j].u != e[j - 1].u)
            head[e[j].u] = j;
    //通过head输出所有对应的边
    for(int i = 1;i <= n;i++)
    {
        cout << "head: " << head[i] << " len = " << len[i] << endl;
        for(int j = head[i];  j != -1 && j <= head[i]-1+ len[i];j++)
            cout << e[j].u << " " << e[j].v << " " << e[j].w << endl;
    }
    return 0;
}

之前的实现代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
////#define LOCAL
const int MAXN = 10000;
struct Edge
{
    int from, to, w;
    //直接写排序规则 起点 , 终点, 权值
    bool operator < (const Edge e) const
    {
        if(from != e.from)
            return from < e.from;
        else if(to != e.to)
            return to < e.to;
        else
            return w < e.w;
    }
}
edge[MAXN];

using namespace std;
int len[MAXN] ,head[MAXN];
//前向星:对边进行排序,按照起点、终点、权值排好顺序 ,同时记录下以某个点为起点的所有边在数组
//的起始位置和数组长度
int main()
{
    int n,m;
    cin >> n >> m;
    //开始输入边的数据,起点,终点,权值
    for(int i = 1;i <= m;i++)
    {
        cin >> edge[i].from >> edge[i].to >> edge[i].w;
        len[edge[i].from]++;
    }
    //构建head[i]数组 和len[i]数组
    //head[i] :以i为起点 在排序好的边集数组中的位置
    sort(edge+1,edge+m+1);
    memset(head,-1,sizeof(head)); // 所有的数值设置为-1,表示没有以该条边为起点的
    head[edge[1].from] = 1;
    for(int i = 2;i <= m;i++)
    { 
        if(edge[i].from != edge[i-1].from)//当两个起点不一样的时候开始排
            head[edge[i].from] = i;
    }
    //构建好之后 开始输出每个数据
    for(int i = 1;i <= n;i++)
    {
        printf("head %d = %d , len = %d\n",i,head[i],len[i]);
        for(int j = head[i] ; head[i] != -1 && j < head[i]+len[i];j++)
        {
            printf("%d %d %d\n",edge[j].from, edge[j].to, edge[j].w);
        }
    }
    return 0;
}
Synopsys安装教程Ubuntu22.04版本 在Ubuntu22版本上安装Synopsys等系列工具,安装DC,VCS等等 阅读详情

相关推荐

饥荒Mod 开发(二):Mod目录结构

饥荒中的每个Mod 都有一些固定的目录结构,各个目录的放着不同类型的文件。动画,图片,源代码等。我们最好是遵守Mod 开发中的各个目录结构,我用的是WeGame 安装的饥荒游戏,Mod 目录如下,这个目录下保存所有订阅的Mod。

小乖写代码 4628

链式前向星

链式前向星(Chained Forward Star)是一种用于表示稀疏图的数据结构。它主要用于解决图论中的一些算法问题,如最短路径、最小生成树等。边数组(Edge Array):存储了每条边的相关信息,如起点、终点、权重等。下一个边数组(Next Edge Array):存储了每个顶点的第一条出发边的索引值,通过这个数组可以找到下一条以同一起点的边。链式前向星的优势在于它能够高效地处理稀疏图,节省了存储空间,并且能够在常数时间内访问某个顶点的所有出发边。

Blueis_oss的博客 1555

S32DS IDE调试技巧:如何用Attach功能高效定位汽车电子MCU的Bootloader问题

本文详细介绍了在汽车电子MCU开发中,如何利用S32DS IDE的Attach调试模式高效定位Bootloader与应用程序的协同问题。通过对比常规调试与Attach模式的本质差异,并深入讲解工程配置、镜像合并及实战调试流程,帮助开发者在不复位、不重新下载程序的前提下,实时分析系统状态,快速解决内存映射冲突、中断向量表重定向等疑难杂症。

weixin_29168393的博客 267

优美的链式前向星

首先贴上一份贴别好的blog详细的介绍了链式前向星的全过程: 链式前向星 贴上一份板子: #include using namespace std; const int maxn = 4e5+100; struct node{ int to, next, weight; }edge[maxn]; int cnt; int head[maxn]; int n; void ad

bbtl_ast的博客 382

【MCU开发规范】:车载MCU开发规范

车载MCU开发规范

1049

【ComfyUI】SD1.5 + ControlNet 边缘检测融合动漫转真人

本文介绍了一个基于ComfyUI的动漫转真人图像生成工作流,通过多模型协同实现高质量的二次元图像转换。该工作流集成了Canny线稿预处理、ControlNet结构控制、VAE编码解码和人脸精细化处理等核心环节,采用majicmixRealistic_v7作为主模型,配合yolov8、SAM等辅助模型。整个流程包含11个标准化步骤,从图像输入、预处理到最终超分输出,通过ControlNet引导和CLIP语义控制确保生成图像的写实感和结构准确性,特别针对人脸区域进行专业优化,最终可输出高分辨率写实人像。

Mr数据杨 1125

深度理解链式前向星

我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了. 用len[i]来记录所有以i为起点的边在数组中的存储长度. 用head[i]记录以i为边集在数组中的第一个存储位置. 那么对于下图:

ACdreamer 7万+

2024-江苏科技大学-模拟-动态接触角,模拟液滴撞击,comsol软件模拟。

相反,其对液滴粘度和平衡接触角的变化基本不敏感。重力势能的影响显著受过程参数调节,随着液滴直径和密度的增加而增加,而随着初始液滴速度和表面张力系数的增加而减小。通过考虑形状因子和粘度修正因子,可以准确定义表面能和粘性耗散能,使得所提出的半经验修正勺状模型表现出良好的性能,在所有65个研究案例中,液滴最大铺展长度因子(βmax)和中心厚度(h)的相对误差基本分别落在5%和10%的区间内。重力势能的影响受过程参数显著调节,随液滴直径和密度的增大而增大,随液滴初始速度和表面张力系数的增大而减小。

qq_15963745的博客 512

好用的链式前向星

对于某一个图,我们存储它的方式有很多种,其中常用的有 1、邻接矩阵(建图简单,使用简单,但是遍历图时间复杂度太大) 2、邻接表(建图较复杂,对于特殊的米字图时间复杂度太大) 3、优化的邻接表,在我前面一片文章里有介绍,就是为每一个节点保存一个LAST数组(最后的点编号),可以极大提高建图速度 http://blog.csdn.net/cnyali/article/details/4...

weixin_30505043的博客 163

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法示例

Robot_PLC_HMI_Automation 1万+

基于Xilinx XDMA 的PCIE通信

基于Xilinx XDMA 的PCIE通信 概述:   想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。实践实践!!! 说明: 参考文档: PCI Express Base Specification Revision 3.0 PCI Express Base Specification Revision 5.0 pg195-pcie-dma PCI Express体系

Crazzy_M的博客 1万+

浅谈前向星

前向星跟邻接表非常像,但是邻接表是二维数组,而前向星是一位数组,他就是把每个都在一维数组中留足空间,记录头和尾,其实这个前向星像是在为后文的链式前向星做铺垫。

DY-hzx的博客 213

【Word提效 No.010】使用AI一键复制格式刷应用格式

本文介绍利用AI工具WorkBuddy实现Word文档格式批量复制的自动化解决方案。通过简单指令即可将指定段落的格式一键应用到多个目标段落,解决传统格式刷操作繁琐、易出错的问题。方案包含三步操作:准备文档、输入指令模板、验收效果,并提供多种场景的现成指令示例。该工具支持字体、段落等格式属性的批量复制,且不会覆盖原文件,适用于论文、手册等文档的格式统一需求。

u011186532的专栏 77

前向星模板

前向星模板 #include <stdio.h> #include <string.h> #include <stdlib.h> #include using namespace std ; #define LL long long #define INF 0x3f3f3f3f #include<bits/stdc++.h> const int m...

luoxutimberjack的博客 212

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

邻接表与前向星

写在前面的话:acdreamers的BLOG给了本文很大启发。 由于在明白了二者的写法之后,发现选择一个掌握就可以了,故只写出了邻接表的模板。 前向星(存边): 原理:将所有边按照先起点后终点的顺序从小到大排序。 记录:对所有点,记录以某点为起点的所有边在 EDGE 数组中的起始位置:head[maxn],与长度(以该点为起点的边的个数):len[maxn]。 局限:排序操作耗时,故使用链式...

Masker 1058

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

前向星与链式前向星

前向星是一种用来存储图的数据结构。它的构造方式很简单,读入每条边的信息,然后存到数组中,然后将数组排序,排序方法是按照起点顺序排序,若起点相同则按终点顺序排序,如果终点相同则按权重排序(如果有权重)。另外,为了方便查询,会用一个数组head[]存储起点为v的第一条边的位置。   具体实现方法如下:   const int maxn=100+10; const int maxm=1000+10

绝望的乐园 2541

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

前向星及spfa大法

一、前向星 一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序),前向星就构造完了。前向星通常用在点的数目太多,或点之间边数太多,一般在别的数据结构不能使用的时候。除了不能直接用起点终点定位以外,前向星几乎是完美的。 第一个任务 用前向星存储图并按其规则输出每一条边 n为图的顶点数,m为该图有多少条边

flymist的博客 301

前向星原理

前向星是一条绳,长相如下: 父节点x->0(head[x]) 父节点x->子节点1(head[x])->0 父节点x->子节点2(head[x])->子节点1->0 父节点x->子节点3(head[x])->子节点2->子节点1->0 定义结构体如下: struct Edge{ int next,v,w...

dl429807872的博客 154

前向星和链式前向星

概念: 前向星:前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置。 链式前向星:链式前向星其实就是静态建立的邻接表,时间效率为O(m),空间效率也为O(m)。遍历效率也为O(m)。 next表示当前结点的下一个节点。 用vector表示二维数组。 模板: //前向星 int idx,e[mx],h[mx],ne[mx]; void add(int a,int b){ e[idx]=b;ne

苍界的博客 358

之前的前向星理解

前向星: 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了. 用len[i]来记录所有以i为起点的边在数组中的存储长度. 用head[i]记录以i为边集在数组中的第一个存储位置. (这样有了head和len就知道哪些下标的存储的信息是属于你想要的起点为i的边) 我们输入边的顺序为: 1 2 2 3 3 4 1 3 4 1 1 5 4

IsayIwant的博客 161
上一篇: 单调栈的应用
下一篇: 链式前向星代码实现与理解
Continue!
博客等级 码龄9年 66粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值