2024/2/17 图论 最短路入门 dijkstra 1

news2025/3/14 1:05:30

目录

算法思路

Dijkstra求最短路

AcWing 849. Dijkstra求最短路 I - AcWing

850. Dijkstra求最短路 II - AcWing题库

最短路

最短路 - HDU 2544 - Virtual Judge (vjudge.net)

【模板】单源最短路径(弱化版)

P3371 【模板】单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

【模板】单源最短路径(标准版)

P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

畅通工程续

 畅通工程续 - HDU 1874 - Virtual Judge (vjudge.net)

算法思路

dijkstra解决的是单源的最短路问题,就是一个顶点到其他顶点的最短路问题

开一个数组dist,dist[x]表示从起点出发,到x的距离

比如这幅图,初始情况下,把所有的dist都设置为inf(也就是无穷大)

dist[1]=0,dist[2]=dist[3]=inf

因为1是起点,自己到自己的距离是0

还有一个bool类型的vis数组,因为每个点只能走一次

选当前离起点最近(权值最小)且没有选过的点,来更新其它点的距离

所以如图:

第一次选1号,更新最近的2,3号点 dist[2]=2,dist[3]=4

第二次选2号(因为权值比1到3的小)  dist[2]+1<dist[3],所以dist[3]=dist[2]+1

这个样例的最短路就得到了

Dijkstra求最短路

AcWing 849. Dijkstra求最短路 I - AcWing

850. Dijkstra求最短路 II - AcWing题库

这两道题只有数据范围的差别,用下面的代码可以一次过

注意:

优先队列q里面的pair存的是dist和点数

二维数组g里面的pair存的是点数和边权

完整代码:

#include <bits/stdc++.h>
#define int long long
const int N = 15e4+10;
std::vector<std::vector<std::pair<int,int>>> g(N);
#define PII std::pair<int,int>
signed main()
{
    int n,m;
    std::cin >> n >> m;
    for(int i = 1;i <= m;i ++)
    {
        int u,v,w;
        std::cin >> u >> v >> w;
        g[u].push_back({v,w});
    }
    std::priority_queue<PII,std::vector<PII>,std::greater<>> q;
    std::vector<int> dist(n+1,INT_MAX);
    std::vector<bool> vis(n+1);
    dist[1]=0;
    q.push({0,1});//存dist和点数
    while(!q.empty())
    {
        auto node = q.top();
        q.pop();
        int cur=node.second;
        if(vis[cur]==true)
            continue;
        else
        {
            vis[cur]=true;
            for(int i = 0;i < g[cur].size();i ++)
            {
                int e=g[cur][i].first;
                int w=g[cur][i].second;
                if(dist[e]>dist[cur]+w)
                {
                    dist[e]=dist[cur]+w;
                    q.push({dist[e],e});
                }
            }
        }
    }
    if(dist[n]==INT_MAX)
        std::cout<<-1;
    else
        std::cout<<dist[n];
    return 0;
}

最短路

最短路 - HDU 2544 - Virtual Judge (vjudge.net)

思路:dijkstra,但是需要建立双向边

注意:多组输入最好不要开全局变量,如果开全局变量记得清空

完整代码:

#include <bits/stdc++.h>
#define int long long
#define PII std::pair<int,int>
const int N = 1e4+10;
signed main()
{
    int n,m;
    while(std::cin >> n >> m)
    {
        if(n==0&&m==0)
            break;
        std::vector<std::vector<std::pair<int,int>>>g (N+1);
        std::priority_queue<PII,std::vector<PII>,std::greater<>> q;
        std::vector<int> dist(n+1,INT_MAX);
        std::vector<bool> vis(n+1);
        dist[1]=0;
        for(int i = 1;i <= m;i ++)
        {
            int u,v,w;
            std::cin >> u >> v >> w;
            g[u].push_back({v,w});
            g[v].push_back({u,w});
        }
        q.push({0,1});//存dist和点数
        while(!q.empty()) {
            auto node = q.top();
            q.pop();
            int cur = node.second;
            if (vis[cur] == true)
                continue;
            else {
                vis[cur] = true;
                for (int i = 0; i < g[cur].size(); i++) {
                    int e = g[cur][i].first;//存点
                    int w = g[cur][i].second;//存边权
                    if (dist[e] > dist[cur] + w) {
                        dist[e] = dist[cur] + w;
                        q.push({dist[e], e});
                    }
                }
            }
        }
        std::cout<<dist[n]<<"\n";
    }
    return 0;
}

【模板】单源最短路径(弱化版)

P3371 【模板】单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:dijkstra模板

完整代码:

#include <bits/stdc++.h>
#define int long long
#define PII std::pair<int,int>
const int N = 5e5+10;
signed main()
{
    int n,m,s;
    std::cin >> n >> m >> s;
    std::vector<std::vector<std::pair<int,int>>> g(n+1);
    std::vector<int> dist(n+1,INT_MAX);
    std::vector<bool> vis(n+1);
    dist[s]=0;
    for(int i = 1; i <= m;i ++)
    {
        int u,v,w;
        std::cin >> u >> v >> w;
        g[u].push_back({v,w});
    }
    std::priority_queue<PII,std::vector<PII>,std::greater<>> q;
    q.push({0,s});//存dist和点数
    while(!q.empty()) {
        auto node = q.top();
        q.pop();
        int cur = node.second;
        if (vis[cur] == true)
            continue;
        else {
            vis[cur] = true;
            for (int i = 0; i < g[cur].size(); i++) {
                int e = g[cur][i].first;//存点
                int w = g[cur][i].second;//存边权
                if (dist[e] > dist[cur] + w) {
                    dist[e] = dist[cur] + w;
                    q.push({dist[e], e});
                }
            }
        }
    }
    for(int i = 1;i <= n;i ++)
    {
        std::cout<<dist[i]<<" ";
    }
    return 0;
}

【模板】单源最短路径(标准版)

P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

和上一题的代码一样,只是数据范围大一点

完整代码:

#include <bits/stdc++.h>
#define int long long
#define PII std::pair<int,int>
const int N = 5e5+10;
signed main()
{
    int n,m,s;
    std::cin >> n >> m >> s;
    std::vector<std::vector<std::pair<int,int>>> g(n+1);
    std::vector<int> dist(n+1,INT_MAX);
    std::vector<bool> vis(n+1);
    dist[s]=0;
    for(int i = 1; i <= m;i ++)
    {
        int u,v,w;
        std::cin >> u >> v >> w;
        g[u].push_back({v,w});
    }
    std::priority_queue<PII,std::vector<PII>,std::greater<>> q;
    q.push({0,s});//存dist和点数
    while(!q.empty()) {
        auto node = q.top();
        q.pop();
        int cur = node.second;
        if (vis[cur] == true)
            continue;
        else {
            vis[cur] = true;
            for (int i = 0; i < g[cur].size(); i++) {
                int e = g[cur][i].first;//存点
                int w = g[cur][i].second;//存边权
                if (dist[e] > dist[cur] + w) {
                    dist[e] = dist[cur] + w;
                    q.push({dist[e], e});
                }
            }
        }
    }
    for(int i = 1;i <= n;i ++)
    {
        std::cout<<dist[i]<<" ";
    }
    return 0;
}

畅通工程续

 畅通工程续 - HDU 1874 - Virtual Judge (vjudge.net)

思路:用dijkstra,双向建边

完整代码:

#include <bits/stdc++.h>
#define int long long
#define PII std::pair<int,int>
signed main()
{
    int n,m;
    while(std::cin >> n >> m)
    {
        std::vector<std::vector<PII>>g(n+1);
        std::vector<int> dist(n+1,INT_MAX);
        std::vector<bool> vis(n+1);
        std::priority_queue<PII,std::vector<PII>,std::greater<>> q;
        for(int i = 1;i <= m;i ++)
        {
            int u,v,w;
            std::cin >> u >> v >> w;
            g[u].push_back({v,w});
            g[v].push_back({u,w});
        }
        int s,t;
        std::cin >> s >> t;
        dist[s]=0;
        q.push({0,s});//存dist和点数
        while(!q.empty())
        {
            auto node = q.top();
            q.pop();
            int cur=node.second;
            if(vis[cur]==true)
                continue;
            vis[cur]=true;
            for(int i = 0;i < g[cur].size();i ++)
            {
                int e=g[cur][i].first;
                int w=g[cur][i].second;
                if(dist[e]>dist[cur]+w)
                {
                    dist[e]=dist[cur]+w;
                    q.push({dist[e],e});
                }
            }
        }
        if(dist[t]==INT_MAX)
            std::cout<<-1<<"\n";
        else
            std::cout<<dist[t]<<"\n";
    }
    return 0;
}

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

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

相关文章

文生视频提示词:故事与主题

内容创意 --故事与主题 Story & Theme 这些词汇覆盖了从基本的故事类型到特定的主题和元素&#xff0c;可用于激发创意和定义视频内容的核心主题。 Adventure 冒险 Romance 浪漫 Mystery 神秘 Fantasy 幻想 Science Fiction 科幻 Horror 恐怖 Thriller 惊悚 Comedy 喜剧 Dr…

EXCEL中不错的xlookup函数

excel中一般要经常用vlookup函数&#xff0c;但其实经常麻烦要正序&#xff0c;从左边到右边&#xff0c;还要数列&#xff0c;挺麻烦的&#xff0c;xlookup的函数还不错&#xff0c;有个不错的一套视频介绍,B站的&#xff0c;地址是&#xff1a;XLOOKUP函数基础用法&#xff0…

Python vars函数

在Python编程中&#xff0c;vars()函数是一个常用的内置函数&#xff0c;用于返回对象的__dict__属性。该属性存储了对象的命名空间&#xff0c;包括对象的所有属性和方法。本文将深入探讨Python中的vars()函数&#xff0c;包括基本用法、适用对象、返回结果、实际应用场景&…

MySQL数据库⑪_C/C++连接MySQL_发送请求

目录 1. 下载库文件 2. 使用库 3. 链接MySQL函数 4. C/C链接示例 5. 发送SQL请求 6. 获取查询结果 本篇完。 1. 下载库文件 要使用C/C连接MySQL&#xff0c;需要使用MySQL官网提供的库。 进入MySQL官网选择适合自己平台的mysql connect库&#xff0c;然后点击下载就行…

线程库接口模拟封装(使用参数包接受参数,2种方法)

目录 引入 模拟实现 思路 传递参数包 代码 thread.hpp main.cpp 示例 引入 之前我们一直使用的都是linux中的原生线程库,但c中其实是有提供封装好的线程库的 -- <thread> 下面我们也来试着封装一下线程接口 模拟实现 思路 首先,明确线程库的核心操作: 创建和销毁…

标签结构比目录结构更易用 | Obsidian实践

当我顿悟了标签结构&#xff08;标签树&#xff09;的构建逻辑&#xff0c;彻底摆脱了目录结构的限制&#xff0c;从此可按任意维度管理和检索笔记。 对于每一个新入坑Obsidian的小白菜来说&#xff0c;通过创建目录结构&#xff0c;对笔记进行管理是最符合直觉的方式。但是&am…

【AIGC】大语言模型

大型语言模型&#xff0c;也叫大语言模型、大模型&#xff08;Large Language Model&#xff0c;LLM&#xff1b;Large Language Models&#xff0c;LLMs&#xff09; 什么是大型语言模型 大型语言模型&#xff08;LLM&#xff09;是指具有数千亿&#xff08;甚至更多&#xf…

php switch、for、foreach、while、do...while

php switch 1. switch2. for循环3. foreach4. while、do...while 1. switch <?php$height 190;switch ($height) {case 160:echo 太矮了;break; //跳出本次循环case 170:echo 还行吧;break; //跳出本次循环case 180:echo 帅哥;break; //跳出本次循环default:echo 迷; }2.…

初始Git及Linux Centos下安装Git

文章目录 前言版本控制器注意Git安装 前言 不知道你⼯作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种⽂档时&#xff0c;为了防⽌⽂档丢失&#xff0c;更改失误&#xff0c;失误后能恢复到原来的版本&#xff0c;不得不复制出⼀个副本&#xff0c;⽐如…

springboot196高校教师科研管理系统

Spring Boot高校教师科研管理系统设计与实现 摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜…

(八)【Jmeter】线程(Threads(Users))之bzm - Concurrency Thread Group

简述 操作路径如下: 作用:模拟一定时间段内达到指定并发数的用户访问。配置:设置目标并发数、启动时间、持续时间等参数。使用场景:测试应用程序在达到一定并发用户数时的性能表现。优点:能够模拟实际并发访问的增长和稳定过程。缺点:主要关注并发数,可能无法模拟真实…

C高级D5作业

1.#!/bin/bash read -p "请输入一个字符>>" -n 1 c echo case $c in [[:lower:]]) echo "小写" ;; [[:upper:]]) echo "大写" ;; [1-9]) echo "数字" ;; …

如何实现Vuex数据持久化

Vuex是一个非常流行的状态管理工具&#xff0c;它可以帮助我们在Vue.js应用中管理和共享数据。然而&#xff0c;当应用重新加载或刷新时&#xff0c;Vuex的状态会被重置&#xff0c;这就导致了数据的丢失。那么&#xff0c;如何才能实现Vuex的数据持久化呢&#xff1f;让我们一…

【自然语言处理】seq2seq模型—机器翻译

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

SECS/GEM的HSMS通讯?金南瓜方案

High Speed SECS Message Service (HSMS) 是一种基于 TCP/IP 的协议&#xff0c;它使得 SECS 消息通信更加快速。这通常用作设备间通信的接口。 HSMS 状态逻辑变化&#xff08;序列&#xff09;&#xff1a; 1.Not Connected&#xff1a;准备初始化 TCP/IP 连接&#xff0c;但尚…

使用Autodl云服务器或其他远程机实现在本地部署知识图谱数据库Neo4j

本篇博客的目的在于提高读者的使用效率 温馨提醒&#xff1a;以下操作均可在无卡开机状态下就可完成 一.安装JDK 和 Neo4j 1.1 ssh至云服务器 打开你的pycharm或者其他IDE工具或者本地终端&#xff0c;ssh连接到autodl的服务器。(这一步很简单如下图) 1.2 安装JDK 由于我…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

PLC_博图系列☞LAD

PLC_博图系列☞LAD 文章目录 PLC_博图系列☞LAD背景介绍LAD优势局限 LAD元素 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 LAD 背景介绍 这是一篇关于PLC编程的文章&#xff0c;特别是关于西门子的博图软件。我并不是专业的PLC编程人员&#xff0c;也不懂电路&a…

[0]是数字的最右边

像这一段代码&#xff0c;把控制信号Ctrl的值&#xff0c;根据此时计数器的值&#xff0c;从Ctrl[0]到Ctrl[7]赋值给led。 之前的理解错误 之前脑子昏头了&#xff0c;看下面的这个图一直觉得不对&#xff0c;才发现这个Ctrl的值我应该从最右边读&#xff0c;即控制信号为Ctrl…

【项目实现】自主HTTP服务器

自主HTTP服务器 项目介绍网络协议栈介绍协议分层 数据的封装与分用数据的封装与分用 HTTP相关知识介绍HTTP的特点 URL格式URI、URL、URNHTTP的协议格式HTTP的请求方法HTTP的状态码HTTP常见的Header CGI机制介绍CGI机制的概念CGI机制的实现步骤CGI机制的意义 日志编写套接字相关…