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

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

邻接表是什么

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

假设一个双向图
在这里插入图片描述
我们如果用邻接矩阵储存就会是这样(没有连接的我们认为权值是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;
}
相关文章
|
21天前
|
机器学习/深度学习 存储 算法
sklearn应用线性回归算法
sklearn应用线性回归算法
24 0
|
1月前
|
算法
经典控制算法——PID算法原理分析及优化
这篇文章介绍了PID控制算法,这是一种广泛应用的控制策略,具有简单、鲁棒性强的特点。PID通过比例、积分和微分三个部分调整控制量,以减少系统误差。文章提到了在大学智能汽车竞赛中的应用,并详细解释了PID的基本原理和数学表达式。接着,讨论了数字PID的实现,包括位置式、增量式和步进式,以及它们各自的优缺点。最后,文章介绍了PID的优化方法,如积分饱和处理和微分项优化,以及串级PID在电机控制中的应用。整个内容旨在帮助读者理解PID控制的原理和实际运用。
72 1
|
1月前
|
机器学习/深度学习 算法 Oracle
ICLR 2024:近似最优的最大损失函数量子优化算法
【2月更文挑战第27天】ICLR 2024:近似最优的最大损失函数量子优化算法
26 3
ICLR 2024:近似最优的最大损失函数量子优化算法
|
1月前
|
存储 算法 测试技术
ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角
ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角
23 1
|
1月前
|
机器学习/深度学习 算法 数据库
KNN和SVM实现对LFW人像图像数据集的分类应用
KNN和SVM实现对LFW人像图像数据集的分类应用
33 0
|
3天前
|
数据采集 算法 数据可视化
R语言聚类算法的应用实例
R语言聚类算法的应用实例
80 18
R语言聚类算法的应用实例
|
3天前
|
算法 数据可视化 数据挖掘
R语言社区主题检测算法应用案例
R语言社区主题检测算法应用案例
|
10天前
|
算法 数据处理 C语言
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
|
12天前
|
算法 索引
【算法与数据结构】深入二叉树实现超详解(全源码优化)
【算法与数据结构】深入二叉树实现超详解(全源码优化)
|
25天前
|
机器学习/深度学习 算法 大数据
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
基于PyTorch对凸函数采用SGD算法优化实例(附源码)
29 3