邻接表存图 SPFA

简介: 邻接表存图 SPFA

代码来自学长讲课视频,不得不说看大神的代码就是舒服


普通数组邻接表存图

//MAXN代表点的最大数量,MAXM代表边的最大数量 
const int MAXN=10000, MAXM=10000;
int head[MAXN];    //存储第x号点链表的头部位置 
int ver[MAXM];    //存储边的终点信息
int edge[MAXM];    //存储边的边权信息
int nextVer[MAXM]; //存储链表中下一个节点的位置
int total;

//初始化 
memset(head, -1, sizeof(head));
total=0;

//加入从x到y的有向边,权值为z
void addEdge(int x, int y, int z){
   
    total++;    //从1开始存 
    ver[total]=y, edge[total]=z;    //边的信息 
    nextVer[total]=head[x], head[x]=total;//插入链表中 
} 

//访问从x出发的所有边
for (int i=head[x]; i!=-1; i=nextVer[i]){
   
    //找到1条从x到y的边,权值为z 
    int y=ver[i], z=edge[i];
}

vector邻接表存图

const int MAXN=10000, MAXM=10000;
//可以将vector看成一列的形式,对应于一列head。
//每个元素都是一个pair<int, int>类型。表示终点和权值 
vector<pair<int, int>> e[MAXM];

//初始化
for (int i=0; i<MAXN; i++)
    e[i].clear(); 

//添加从x到y边权为z的边信息
//这个就是尾插法插进链表。
//要知道邻接表里每个头顶点连接的链表中的节点顺序无所谓 
void addEdge(int x, int y, int z){
   
    e[x].push_back(make_pair(y, z));
} 

//访问从x出发的所有边
for (int i=0; i<e[x].size(); i++){
   
    //找到一条从x到y的边权为z的边 
    int y=e[x][i].first;
    int z=e[x][i].second;
}

再帖一个spfa+邻接表存图的代码(感觉全忘光了)
https://blog.csdn.net/weixin_42172261/article/details/95390000


洛谷3371

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

vector<pair<int, int> > edge[50005];
int dis[10005];
int book[10005];
int n, m, s;

void add_edge(int x, int y, int z){
   
    edge[x].push_back(make_pair(y, z));
}
void spfa(){
   
    for (int i=1; i<=n; i++)
        dis[i] = (1<<31) -1;
    dis[s] = 0;
    queue<int> q;
    while (!q.empty())
        q.pop();
    q.push(s);
    book[s] = 1;
    while (!q.empty()){
   
        int t = q.front();
        q.pop();
        book[t] = 0;
        for (int k=0; k<edge[t].size(); k++){
   
            int y=edge[t][k].first;
            int z=edge[t][k].second;
            if (dis[y] > dis[t]+z){
   
                dis[y]=dis[t]+z;
                if (book[y]==0){
   
                    q.push(y);
                    book[y]=1;
                }
            }
        }
    }
}
int main(){
   
    scanf("%d%d%d", &n, &m, &s);
    for (int i=1; i<=m; i++){
   
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        add_edge(x, y, z);
    }
    spfa();
    for (int i=1; i<=n; i++)
        printf("%d ", dis[i]);
    return 0;
}
相关文章
|
机器学习/深度学习 自然语言处理 算法
浅述几种文本和图像数据增强的方法
在现实场景中,我们往往收集不到太多的数据,那么为了扩大数据集,可以采用数据增强手段来增加样本,那么平常我们应该怎么做数据增强的呢? 什么是数据增强 数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。
|
JSON Linux 数据格式
原来是Gson导致,本地和linux服务器不同的环境导致Date转换出现问题:Invalid time zone indicator ‘ ‘
看到报错日志,第一反应就是,date数据的问题,同时又能发现全是和gson相关 结合报错行数的代码,盲猜就是gson对时间处理的问题了 于是寻找解决方法
1056 0
|
Prometheus 监控 Cloud Native
如何优化Java应用的内存使用
如何优化Java应用的内存使用
|
Java Android开发
如何使用IDEA创建一个简单的java工程?
这篇文章提供了使用IntelliJ IDEA创建简单Java工程的步骤,包括在`src`目录下建立两个特定的包。
如何使用IDEA创建一个简单的java工程?
|
小程序 前端开发 Java
java 生成小程序二维码
java 生成小程序二维码
361 0
|
C语言 C++
指针变量作为函数参数
指针变量作为函数参数
350 1
|
前端开发 开发工具 Android开发
移动应用开发之旅:从新手到专家
在本文中,我们将探索移动应用开发的奇妙世界。无论你是刚刚踏入这个领域的新手,还是已经有一定经验的开发者,本文都将为你提供有价值的见解和指导。我们将从基础概念开始,逐步深入到更复杂的主题,如移动操作系统的选择、开发工具的使用以及如何优化你的应用以获得更好的性能和用户体验。通过阅读本文,你将获得一个全面的视角,了解如何从零开始构建你自己的移动应用,并最终成为一名移动应用开发专家。让我们一起踏上这段激动人心的旅程吧!
374 3
|
机器学习/深度学习 算法 Serverless
代价函数详解
代价函数详解
|
机器学习/深度学习 编解码 算法
YOLOv5改进 | 主干网络 | 将backbone替换为MobileNetV3【小白必备教程+附完整代码】
本文介绍了将YOLOv5的backbone替换为MobileNetV3以提升目标检测性能的教程。MobileNetV3采用倒残差结构、Squeeze-and-Excitation模块和Hard-Swish激活函数,实现更高性能和更低计算成本。文中提供了详细的代码实现,包括MobileNetV3的关键组件和YOLOv5的配置修改,便于读者实践。此外,还分享了完整代码链接和进一步的进阶策略,适合深度学习初学者和进阶者学习YOLO系列。
|
SQL 调度 数据库
【Database】Sqlserver如何定时备份数据库和定时清除
【Database】Sqlserver如何定时备份数据库和定时清除
1815 2

热门文章

最新文章