单源最短路问题

news2024/10/7 16:17:11

全部代码

全部代码在github acwing 上
正在更新
https://github.com/stolendance/acwing
图论
欢迎大家star与fork
在这里插入图片描述

单源最短路问题 先用spfa算法 不行再换其他的

spfa-超级万能 说不定比dijsktra还快

dis[] 代表第k到某一点的最短距离

queue 代表刚被更新的点 它有可能更新其他路径 所以检查它的出边

isin代表该点是否在queue中

队列放入起点 <-k
while(队列不为空)
	取出队头
	遍历所有t的出边  t-w>b
		如果dis[b]>dis[t]+w[t,b],更新,如果b不在队列中,加入b

在这里插入图片描述

typedef long long ll;
typedef pair<ll,ll> pll;
struct Edge
{
    int next;
    int val;
    Edge(int next_,int val_):next(next_),val(val_){;}
};
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        vector<vector<Edge> > graph(n+1);
        for(auto item:times)
        {
            int a=item[0];
            int b=item[1];
            int c=item[2];
            graph[a].push_back(Edge(b,c));
        }
        vector<ll> dis(graph.size(),INT_MAX);
        vector<int> isin(graph.size(),0);
        queue<int> ls;
        ls.push(k);
        dis[k]=0;
        isin[k]=1;
        while(ls.size())
        {
            int t=ls.front();
            ls.pop();
            isin[t]=0;
            for(int i=0;i<graph[t].size();i++)
            {
                // k->t->id
                int distance=graph[t][i].val;
                int id=graph[t][i].next;
                if(dis[t]+distance<dis[id]){
                    dis[id]=dis[t]+distance;
                    if(isin[id]==0)
                    {
                        ls.push(id);
                        isin[id]=1;
                    }
                }
               
            }
        }
        int rs= *max_element(dis.begin()+1,dis.end());
        if(rs==INT_MAX) return -1;
        else return rs;
        }
};

朴素版dijsktra -单源最短路-所有边权重都是正数 基于 稠密图(邻接矩阵)

s:当前已经确定最短路径距离的点

  1. dis[0 ]=0 dis[i]=+OO 只有起点被确定到了

  2. for(i 1 …n)

    ​ t《- 不在s中的距离最近的点

    ​ s〈-t

    ​ 用t更新其他点的距离(看下)

dij实现的时候是通过 将距离设置成无穷大 来表达 不可达

dij 由于边很多, 稠密图 所以用邻接矩阵存即可

dij 需要找n个点 所以外层是一个for循环x

总结下来:
	1. 把未加入的最近的加进来
	2. 标记加入
	3. 根据加入的点更新距离

在这里插入图片描述

#include<iostream>
#include<vector>
using namespace std;
#define INA INT_MAX
//https://leetcode.cn/problems/network-delay-time/
int networkDelayTime(vector<vector<int> >& times, int N, int k) {
   // 因为点的坐标是从1开始 , 所以开N+1个
   // 直接在graph上更新 方便很多
   // graph要采用long long  INT_MAX+某个数 不会变成负数
 
    vector<vector<long long> > graph(N+1,vector<long long>(N+1,INT_MAX));
    for(int i=1;i<=N;i++)    graph[i][i]=0;
    for(auto e:times)    graph[e[0]][e[1]]=e[2];
    vector<int> vis(graph.size(),0);
    vis[k]=1;
    // 只要找下除了起点的接下来的点
    for(int i=1;i<graph.size()-1;i++)
    {
        int minid=0,minx=INA;
        // 在没有使用过的检查最短的距离
        for(int j=1;j<graph.size();j++)
        {
            if(vis[j]==0&&graph[k][j]<minx)
            {
                minid=j;
                minx=graph[k][j];
            }
        }
        vis[minid]=1;
        // 更新
        // 根据这个点更新其他所有距离
        for(int j=1;j<graph.size();j++)
        {
            graph[k][j]=min(graph[k][j],graph[k][minid]+ graph[minid][j]);
        }
    }
    int ans=0;
    for(int i=1;i< graph.size();i++)
    {
        if(graph[k][i]==INT_MAX) return -1;
        ans=max(ans, (int)graph[k][i]);
    }
    return ans;
}
int main()
{

    vector<vector<int> > times={{2,1,1},{2,3,1},{3,4,1}};
    int rs=networkDelayTime(times,4,2);
    cout<<rs<<endl;

}

dijstra 稀疏图(邻接表) -我更喜欢的方式!!!

求点k到其他点的距离
与上面不同的情况是, 采用邻接表+最小堆
最小堆 的格式是(点k到该点的距离,该点的id)
dis[] 存储的是点k到达每个点的最短距离
st[] 存储的是否能确定点k到达每个点的距离

while(队列不为空)
{
	队列弹出一个
	如果该点确定了最短距离,就不管它 if(st[]) continue
	把弹出的这个点加入最短距离
	根据这个点进行扩展,遍历这个点指向其他点的边
				如果比div小,则更新距离
				加入队列中
}

在这里插入图片描述
在这里插入图片描述

typedef long long ll;
typedef pair<ll,ll> pll;
struct Edge
{
    int next;
    int val;
    Edge(int next_,int val_):next(next_),val(val_){;}
};
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        vector<vector<Edge> > graph(n+1);
        for(auto item:times)
        {
            int a=item[0];
            int b=item[1];
            int c=item[2];
            graph[a].push_back(Edge(b,c));
        }
        vector<ll> dis(graph.size(),INT_MAX);
        vector<int> st(graph.size(),0);
        priority_queue<pll,vector<pll>,greater<pll> > ls;
        ls.push(pll(0,k));
        dis[k]=0;
        while(ls.size())
        {
            auto item=ls.top();
            ls.pop();
            ll distance=item.first;
            int id=item.second;
            // 保证未加入
            if(st[id]) continue;
            // 加入
            st[id]=1;
            // 扩展更新
            for(int i=0;i<graph[id].size();i++)
            {
                // k->id->id2
                //  distance distance2

                int id2=graph[id][i].next;
                int distance2=graph[id][i].val;
                if(distance+distance2<dis[id2])
                {
                    dis[id2]=distance+distance2;
                    // 加入队列
                    ls.push(pll(dis[id2],id2));
                }
            }
        }
        int rs=(int)*max_element(dis.begin()+1,dis.end());
        if(rs==INT_MAX) return -1;
        else return rs;
        }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/482847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java校招面试】基础知识(三)——多线程与并发

目录 前言一、基础概念二、互斥锁三、Java内存模型&#xff08;JMM&#xff09;四、线程池后记 前言 本篇主要介绍Java多线程与并发相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第三篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&a…

每日一题——反转字符串—II

每日一题 反转字符串——II 题目链接 思路 我们先来举几个例子来理解题目意思 字符串“ abcdefgh ”&#xff0c;k 2&#xff0c;那么依据题目意思&#xff0c;反转后的字符串应该是“ bacdfegh ”&#xff08;即每2k个字符&#xff0c;就反转前k个字符&#xff0c;且无剩余…

基于 Python+Flask+SQLite 的网易云音乐评论情感分析系统

基于 PythonFlaskMySQL 的网易云音乐评论情感分析系统&#xff0c;采用Echart构建图表&#xff0c;支持一键切换颜色主题&#xff0c;通过连接数据库获取评论数据。对失效的爬虫代码进行了更新&#xff0c;可通过歌曲id_半_自动获取评论&#xff0c;具体可以看下方的过程展示。…

展望Flink各版本及新特性

展望Flink各版本及新特性 一 Flink 1.9 版本1.1 细粒度批作业恢复1.2 State Processor API1.3 Stop-with-Savepoint1.4 新 Blink SQL 查询处理器预览1.5 Table API / SQL 的其他改进 二 Flink 1.10 [重要版本 : Blink 整合完成]2.1 内存管理及配置优化2.2 统一的作业提交逻辑2.…

图像去噪简单介绍—并给出示例代码

文章目录 图像去噪简单介绍—并给出示例代码去噪的基本原理常见的噪声类型高斯噪声椒盐噪声马赛克噪声脉冲噪声 添加噪声的代码添加高斯噪声添加椒盐噪声 noise_pic常用的去噪方法均值滤波中值滤波高斯滤波双边滤波基于深度学习的图像去噪 总结图片来源 图像去噪简单介绍—并给…

Win11如何下载安装java?

一、问题描述 我在复现论文代码的时候&#xff0c;遇到了这样的问题&#xff1a; 我没有下载java&#xff0c;那么该如何解决呢&#xff1f; 下载 Java 的作用是为了能够在计算机上运行使用 Java 语言编写的应用程序。Java 是一种广泛使用的编程语言&#xff0c;可用于开发各…

【leetcode刷题总结】——代码随想录(数组总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构&#xff0c;再从简单刷起&#xff0c;做了几个类型题目之后&#xff0c;再慢慢做中等题目、困难题目。 以下是个人刷题总结&#xff0c;…

多线程编程的安全问题和解决措施

线程不安全的概念 由于多线程并发执行&#xff0c;导致结果出错&#xff0c;我们称这种线程是不安全的。 多线程编程出错的原因 一&#xff1a;线程之间并发执行的随机性导致线程不安全 二&#xff1a;多个线程对同一个对象进行修改 三&#xff1a;线程的操作不是原子性的…

Vscode搭建ESP-IDF开发环境指南-Ubuntu ESP32-C3 合宙

文章目录 1.Ubuntu环境搭建2.vscode安装3.esp-idf插件如果到这里没出现问题的话&#xff0c;就能顺利安装了&#xff0c;如果出现问题会在输出那一栏里报错&#xff0c;根据错误去找原因就好&#xff0c;常见的错误就是网络原因以及之前的依赖包没有装好 ![](https://img-blog.…

优思学院|受控文件在质量管理体系中的作用?

在质量管理体系中&#xff0c;受控文件是指受到控制和管理的文件&#xff0c;包括政策、程序、指南、规程、说明书、作业指导书、记录等&#xff0c;它们记录了组织内各种活动的要求和实施方法&#xff0c;并规定了文件的创建、审批、发布、变更和废止等流程&#xff0c;以确保…

宝塔怎么安装青龙面板-跑京东豆脚本

一、搭建青龙面板 安装docker管理器 我们使用宝塔的Docker管理器来一键安装Docker 在软件商店内搜索Docker,直接安装第一个应用即可。 拉取镜像运行容器 在安装完docker之后我们就可以开始拉取docker镜像并运行容器了,ssh连接服务器命令行中输入下面的代码: docker run …

TOGAF架构内容—TOGAF 内容框架和企业元模型

一、概述 TOGAF ADM 提供了一个流程生命周期&#xff0c;用于在企业内创建和管理架构。在 ADM&#xff0c;对输入、输出和步骤的讨论&#xff0c;描述了许多架构工作产品或工件&#xff0c;例如过程和 应用。 此处提供的内容框架和企业元模型为这些术语定义了正式结构&#x…

【python】NameError: No such file or directory 问题解决

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 1. 问题 最近有小伙伴经常问到这个报错&#xff0c;今天来分享一下具体怎么解决。 [Errno 2] No such file or directory: ./mnist_image_label/mnist_train_jpg_60000.txt这个没有查找到子文件或者子文件夹的问题 2. 解决…

WIZnet 的 TOE 设计大赛

链接: TOE Design Contest 介绍 欢迎来到 WIZnet 的年度物联网设计大赛&#xff01; TOE 竞赛是对您的 IoT 技能和创造力的终极考验。 借助强大的 W5300 网络控制器芯片&#xff0c;您将能够以前所未有的方式将您的物联网愿景变为现实。 无论您是经验丰富的专业人士还是刚刚起…

计算机提示vcruntime140.dll丢失是什么意思?vcruntime140.dll丢失的解决方法(详细方法)

计算机丢失vcruntime140.dll是什么意思&#xff1f;经常看到有小伙伴有在网上问这样的问题&#xff0c;电脑上这个vcruntime140.dll文件丢失的问题经常发生吧&#xff0c;那么就很有必要给大家详细的说说这一方面的问题了&#xff0c;下面我们来看看 第一&#xff1a;vcruntim…

RocketMQ的简单使用

大家好&#xff0c;我是Leo&#xff01;今天来和大家分享RocketMQ的一些用法。 领域模型介绍 Producer: 用于生产消息的运行实体。 Topic: 主题&#xff0c;用于消息传输和存储的分组容器。 MessageQueue: 消息传输和存储的实际单元容器。 Message: 消息传输的最小单元。 C…

如何让你的 WebSocket 接口测试更高效?拯救你的接口测试工作

目录 引言 WebSocket介绍 HTTP与WebSocket的区别 WebSocket测试方法 使用在线工具 使用Postman 使用Jmeter 使用Python 结语 引言 你是否曾经为 WebSocket 接口测试中复杂的协议和难以捕获的数据而感到束手无策&#xff1f;WebSocket 协议与传统的 HTTP 协议不同&…

【牛客网】美国节日与因式分解

目录 一、编程题 1.美国节日 2.因式分解 一、编程题 1.美国节日 链接&#xff1a;美国节日__牛客网 (nowcoder.com) 和中国的节日不同&#xff0c;美国的节假日通常是选择某个月的第几个星期几这种形式&#xff0c;因此每一年的放假日期都不相同。具体规则如下&#xff1a…

volatile与synchronized

文章目录 前言一、简介volatilesynchronized 二、名词解释可见性原子性指令重排临界区对象锁类锁 二、实战使用1 Volatile可以解决的问题2 volatile无法解决非原子性操作问题--synchronized 总结 前言 volatile与synchronized 都是java的关键字 volatile一般修饰变量,被修饰的…

做了一年csgo搬砖项目,还清所有债务:会赚钱的人都在做这件事 !

前段時间&#xff0c;在网上看到一句话&#xff1a;有什么事情&#xff0c;比窮更可怕&#xff1f; 有人回答说&#xff1a;“又忙又窮。” 很扎心&#xff0c;却是绝大多数人的真实写照。 每天拼死拼活的996&#xff0c;你有算过你的時间值多少钱&#xff1f; 我们来算一笔…