邻接表以及其算法应用(优化图的存储)

简介: 本文主要讲述了邻接表的原理,以及如何生成邻接表和其在算法方面的引用

邻接表是什么

邻接表是一种存储图的链式存储结构,和邻接矩阵功能一样。

假设一个双向图
在这里插入图片描述
我们如果用邻接矩阵储存就会是这样(没有连接的我们认为权值是inf)
0 6 inf inf 4
6 0 8 inf inf
inf 8 0 2 3
inf inf 2 0 inf
4 inf 3 inf 0
我们这时候会发现,邻接矩阵会浪费一些空间,也就是没有连接的边,他也会存入一个最大值

假如用邻接表储存呢?
首先邻接表由两个主要的部分组成

  1. 头节点:用来储存节点编号
  2. 表节点:用来储存权值和所连接的节点标号

在这里插入图片描述
这时我们会发现邻接矩阵的空间复杂度是O(n^2)
邻接表的空间复杂度是O(n+m)
所以在稀疏图中邻接表比较省空间

邻接表在算法中的应用

优化最短路算法(SPFA,迪杰斯特拉)
其中有邻接表在实战时如何创建和如何遍历
可以用这个题来练手
参考代码:

//迪杰斯特拉,优先队列优化
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;

typedef pair<int,int> PII;
const int N=10001;
const int inf=0x3f3f3f3f;
struct no
{
    int a;
    int b;
    int c;
    int next;
}mp[N];
int n,m,tot;
int book[N];
int dis[N];
int head[N]; 
void add(int a, int b, int c)//创建邻接表
{
    mp[tot].b=b;
    mp[tot].c=c;
    mp[tot].next=head[a];
    head[a]=tot++;
}
void dij()
{
    memset(book,0,sizeof book);
    memset(dis,inf,sizeof dis);
    priority_queue<PII,vector<PII>,greater<PII> > qu;
    dis[1]=0;
    qu.push({0,1});
    while(qu.size())
    {
        PII ne=qu.top();
        qu.pop();
        int u=ne.second;
        if(book[u]) continue;
        book[u]=1;
        for(int j=head[u]; j!=-1; j=mp[j].next)//遍历邻接表
        {
            int go=mp[j].b;
            if(!book[go]&&dis[go]>dis[u]+mp[j].c)
            {
                dis[go]=dis[u]+mp[j].c;
                qu.push({dis[go],go});
            }    
        } 
    }
    cout<<dis[n]<<endl;
}
int main()
{
    while(cin>>n>>m)
    {
        if(n==0&&m==0) break;
        tot=0;
        memset(head,-1, sizeof head);
        while(m--)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
            add(b,a,c);
        }
        dij();
    }
    return 0;
}
//SPFA
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

const int N=1e4+5;
const int inf=0x3f3f3f3f;
int n,m,t;
int dis[N];
int pre[N];
int book[N];
struct no
{
    int a;
    int b;
    int v;
    int next;
}mp[N];
void add(int a,int b,int v)
{
    mp[t].a=a;
    mp[t].b=b;
    mp[t].v=v;
    mp[t].next=pre[a];
    pre[a]=t++;
}
void spfa(int n)
{
    queue<int>q;
    memset(dis,inf,sizeof dis);
    memset(book,0,sizeof book);
    book[1]=1;
    dis[1]=0;
    q.push(1);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        book[u]=0;
        for(int i=pre[u]; i!=-1; i=mp[i].next)
        {
            int v=mp[i].b;
            if(dis[v]>dis[u]+mp[i].v)
            {
                dis[v]=dis[u]+mp[i].v;
                if(!book[v])
                {
                    book[v]=1;
                    q.push(v);
                }
            }
        }
    }
    printf("%d\n",dis[n]);
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0&&m==0) break;
        t=1; 
        memset(pre,-1,sizeof pre);
        for(int i=1; i<=m ;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            if(a!=b)
            {
                add(a,b,c);
                add(b,a,c);
            }
        } 
        spfa(n);
    }
    return 0;
}
相关文章
|
25天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
72 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
3天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
|
26天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
165 80
|
14天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
16天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
119 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
12天前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。
|
11天前
|
算法 决策智能
基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法
本项目基于MATLAB2022A,使用模拟退火(SA)和蚁群优化(ACO)算法求解旅行商问题(TSP),对比两者的仿真时间、收敛曲线及最短路径长度。SA源于金属退火过程,允许暂时接受较差解以跳出局部最优;ACO模仿蚂蚁信息素机制,通过正反馈发现最优路径。结果显示SA全局探索能力强,ACO在路径优化类问题中表现优异。
|
19天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
22天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
23天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。

热门文章

最新文章