前向星

理解前向星

定义:
参照来源: (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;
}
标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值