单源最短路的扩展应用

news2025/1/10 3:33:58

AcWing 1137. 选择最佳线路  

有一天,琪琪想乘坐公交车去拜访她的一位朋友。

由于琪琪非常容易晕车,所以她想尽快到达朋友家。

现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。

已知城市中共包含 n 个车站(编号1~n)以及 m 条公交线路。

每条公交线路都是 单向的,从一个车站出发直接到达另一个车站,两个车站之间可能存在多条公交线路。

琪琪的朋友住在 s号车站附近。

琪琪可以在任何车站选择换乘其它公共汽车。

请找出琪琪到达她的朋友家(附近的公交车站)需要花费的最少时间。

输入格式

输入包含多组测试数据。

每组测试数据第一行包含三个整数 n,m,s,分别表示车站数量,公交线路数量以及朋友家附近车站的编号。

接下来 m行,每行包含三个整数 p,q,t,表示存在一条线路从车站 p 到达车站 q,用时为 t。

接下来一行,包含一个整数 w,表示琪琪家附近共有 w个车站,她可以在这 w 个车站中选择一个车站作为始发站。

再一行,包含 w个整数,表示琪琪家附近的 w个车站的编号。

输出格式

每个测试数据输出一个整数作为结果,表示所需花费的最少时间。

如果无法达到朋友家的车站,则输出 -1。

每个结果占一行。

 

输入样例:

5 8 5
1 2 2
1 5 3
1 3 4
2 4 7
2 5 6
2 3 5
3 5 1
4 5 1
2
2 3
4 3 4
1 2 3
1 3 4
2 3 2
1
1

输出样例:

1
-1

/

首先先来两个反例

/ 数据:8/10,缺少优化两个数据 spfa,dij 均为8/10
#include<bits/stdc++.h>
using namespace std;
const int N = 1010,M = 2e5+10,INF = 0x3f3f3f3f;
typedef pair<int, int> PII;

int n,m,s,W;
int e[M],ne[M],w[M],h[N],idx;
int dist[N];
bool st[N];

void add(int a, int b, int c) 
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

int dij(int x)
{
    memset(st,0,sizeof st);
    memset(dist, 0x3f, sizeof dist);
    dist[x] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, x});

    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.second, distance = t.first;

        if (st[ver]) continue;
        st[ver] = true;

        for (int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > dist[ver] + w[i])
            {
                dist[j] = dist[ver] + w[i];
                heap.push({dist[j], j});
            }
        }
    }
}


int main()
{
    while(cin>>n>>m>>s)
    {
        memset(h, -1, sizeof h);

        for(int i=0;i<m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }

        cin>>W;

        int res=INF;
        while(W--)
        {
            int a;
            scanf("%d",&a);
            dij(a);
            res=min(res,dist[s]);
        }  
        if(res==0x3f3f3f3f) res=-1;
        printf("%d\n",res);
    }
    return 0;
}

//由于忘记开虚拟源点多了1000条变 M开小了1,导致7/10,以为思路不对浪费半个小时,直接把M多开1.5倍就过了
#include<bits/stdc++.h>
using namespace std;
const int N = 1010,M = 3e5+10,INF = 0x3f3f3f3f;
typedef pair<int, int> PII;

int n,m,s,W;
int e[M],ne[M],w[M],h[N],idx;
int dist[N];
bool st[N];

void add(int a, int b, int c) 
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

int dij(int x)
{
    memset(st,0,sizeof st);
    memset(dist, 0x3f, sizeof dist);
    dist[x] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, x});

    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.second, distance = t.first;

        if (st[ver]) continue;
        st[ver] = true;

        for (int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > dist[ver] + w[i])
            {
                dist[j] = dist[ver] + w[i];
                heap.push({dist[j], j});
            }
        }
    }
}


int main()
{
    while(cin>>n>>m>>s)
    {
        memset(h, -1, sizeof h);

        for(int i=0;i<m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }

        cin>>W;

        int res=INF;

        int k=0;

        while(W--)
        {
            int a;
            scanf("%d",&a);
            add(k,a,0);
        }  
        dij(k);
        res=dist[s];
        if(res==0x3f3f3f3f) res=-1;
        printf("%d\n",res);
    }
    return 0;
}

AC代码:

//超级源点优化 通过
#include<bits/stdc++.h>
using namespace std;
const int N = 1010,M = 2e5+10,INF = 0x3f3f3f3f;
typedef pair<int, int> PII;

int n,m,s,W;
int e[M],ne[M],w[M],h[N],idx;
int dist[N];
bool st[N];
int id[N];

void add(int a, int b, int c) 
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

void spfa()
{
    memset(dist,0x3f,sizeof dist);

    cin>>W;
    queue<int> q;

    while(W--)
    {
        int a;
        cin>>a;
        dist[a]=0;
        q.push(a);
        st[a]=1;
    }

    while(q.size())
    {
        auto t=q.front();
        q.pop();

        st[t]=0;
        for(int i=h[t];~i;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>dist[t]+w[i])
            {
                dist[j]=dist[t]+w[i];
                if(!st[j])
                {
                    st[j]=1;
                    q.push(j);
                }
            }
        }
    }
}

int main()
{
    while(cin>>n>>m>>s)
    {
        memset(h, -1, sizeof h);

        for(int i=0;i<m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }

        spfa();
        int res=INF; 
        res=dist[s];
        if(res==INF) res=-1;
        printf("%d\n",res);
    }
    return 0;
}

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

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

相关文章

解决 Visual Studio Code 编译器代码自动格式化

首先找到.vscode下的settings.json配置文件 将vue3snippets.enable-compile-vue-file-on-did-save-code更改为false

多个HttpSecurity配置(局部AuthenticationManager)

前言 项目用的ruoyi的扩展版本(ts版本)&#xff0c;如果有缺失类&#xff0c;可以自行下载或补充------》个人理解 实现多端token&#xff0c;多端httpSecurity&#xff0c;并且相互隔离&#xff08;局部AuthenticationManager管理认证及授权&#xff09; 在最近的项目中遇到一…

[元带你学: eMMC协议 28] eMMC 上电时序 | eMMC 上电指南

依JEDEC eMMC及经验辛苦整理,原创保护,禁止转载。 专栏 《元带你学:eMMC协议》 内容摘要 全文 1500 字, 主要内容 eMMC 上电规范 和 eMMC 上电指南, 这部分内容偏向电气特性,如果不是硬件的同学只要特别浅的了解, 一带而过。 eMMC 上电规范 eMMC 电压 VCCQ指的是接口…

min_free_kbytes

转自&#xff1a;技术分享 | MemAvailable 是怎么计算的-腾讯云开发者社区-腾讯云 背景 前两天安装 OceanBase 时遇到一个小问题&#xff1a; 很明显&#xff0c;安装OB时要求服务器可用内存至少 8G&#xff0c;不达标就无法安装。为了凑这3台10G内存的服务器我已经费了不少劲…

springMVC快速入门

springMVC快速入门 简介 MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器类划分。 M(model)&#xff1a;模型层&#xff0c;指工程中的javaBean,作用是处理数据 javaBean分为两类&#xff1a; 一类称为实体类Bean&#xff08;专门存储业务数据&#xff0c;如…

unity 控制text根据字数自动扩展大小,并扩展UI背景

需求&#xff1a;文字内容位置保持不变&#xff0c;向下增加&#xff0c;背景框随之同步扩展。 1.UGUI 九宫格 拉伸 对背景框图片资源处理&#xff0c;避免图片拉伸。 (10条消息) unity UGUI 九宫格 拉伸_unity九宫格拉伸_野区捕龙为宠的博客-CSDN博客 2.背景框添加组件 3.…

Linux 学习记录55(ARM篇)

Linux 学习记录55(ARM篇) 本文目录 Linux 学习记录55(ARM篇)一、使用C语言封装GPIO函数1. 封装GPIO组寄存器2. 封装GPIO模式以及相关配置3. 封装GPIO初始化结构体4. 使用自己的封装配置GPIO 一、使用C语言封装GPIO函数 1. 封装GPIO组寄存器 #define GPIOA ((GP…

断路器分合闸线圈低电压试验

试验目的 断路器的分、 合闸线圈动作电压是保证断路器有效进行分合闸操作的一项重要参 数, 其分、 合闸电压的大小应符合规程要求。 分闸线圈的最低可靠动作值应在额定电 压的 30% ~ 65% , 合闸线圈的最低可靠动作值应在额定电压的 30% ~ 85% , 才能保证 断路器有效进行分合闸…

代码随想录算法训练营第二十二天 | 读PDF复习环节2

读PDF复习环节2 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…

vue3中使用wavesurfer插件 动态生成id

需求最终实现的是对话这种&#xff0c;音频文字的对话 使用方法&#xff1a; npm install wavesurfer.js --save官方文档&#xff1a; https://wavesurfer-js.org/ 参数&#xff0c;方法可以去文档查看 直接放封装组件代码 开发背景vue3ts WaveSurfer.vue <template&…

Java学习笔记----Day11(多线程)

多线程 1. 进程、线程2. 实现线程的三种方式3. 线程的生命周期4. 线程里常用的方法5. 线程的调度&#xff08;了解&#xff09;6. 多线程并发环境下&#xff0c;数据的安全问题7. Java三大变量&#xff08;线程同步机制synchronized&#xff09;【重要的内容】8. 死锁9. 开发中…

【正点原子H750MiniPro H750】按键以及时钟

文章目录 前言1.CubeMx的配置步骤1.配置RCC2.配置按键IO口 3.测试代码 总结 前言 H750的最高主频可以达到480Mhz但是一开始在CubeMx配置过程中发现主频达到480Mhz时会报错&#xff0c;以下将会介绍解决办法以及按键移植。 1.CubeMx的配置步骤 1.配置RCC 完成上述步骤配置时钟…

【Ajax】笔记-Axios与函数发送AJAX请求

Axios 和 Ajax 的区别 1、Axios是一个基于Promise的HTTP库&#xff0c;而Ajax是对原生XHR的封装&#xff1b; 2、Ajax技术实现了局部数据的刷新&#xff0c;而Axios实现了对ajax的封装。 优缺点&#xff1a; ajax&#xff1a; 本身是针对MVC的编程,不符合现在前端MVVM的浪潮 基…

小程序 user agent stylesheet 覆盖了page下wxss背景色

如下图&#xff1a; login页面的page下的背景色&#xff0c;被&#xff1a;user agent stylesheet覆盖。 分析与解决&#xff1a; 1、user agent stylesheet是浏览器默认样式表&#xff0c;是浏览器默认样式。 2、不同浏览器的默认样式不同个&#xff0c;甚至同种浏览器不同版…

Linux笔记——rpm与yum下载软件命令介绍

系列文章目录 Linux笔记——进程管理Linux笔记——进程管理与网络监控技术讲解Linux笔记——进程管理 Linux笔记——管道相关命令以及shell编程 Linux笔记——磁盘进行分区与挂载介绍 文章目录 系列文章目录 前言 一 RPM介绍 1.1 RPM简单介绍 1.2 RPM命令语法 1.2.1 …

大专毕业生想进入单片机行业,我有何选择?

我在这说一些单片机行业找工作的一些观点和经验。确实&#xff0c;单片机工作相对于IT行业来说&#xff0c;对专业知识和技能的要求可能稍微高一些。这是因为单片机开发涉及到硬件和底层编程&#xff0c;需要掌握嵌入式系统、电路设计、数字和模拟电子等方面的知识。拥有专业对…

CSDN周赛-第65期(参赛体验)

CSDN周赛-第65期&#xff08;参赛体验&#xff09; 竞赛内容考试时间考试成绩题目分析体验及感悟 竞赛内容 满分100分&#xff0c;4道非编程题与2道编程题&#xff0c;编程题可使用Java、C、C、C#、Python、JavaScript、lua、go等编程语言。 考试时间 考试进入时间&#xff…

leetcode 51. N 皇后

2023.7.24 回溯经典应用“N皇后”问题。 本题依旧是利用回溯来做&#xff0c;将棋盘是放在一个vector<string>数组里面&#xff0c;棋盘的行数代表树的高度&#xff0c;棋盘的列数代表树的宽度。 还需要定义一个辅助函数valid用于判断当前棋盘符不符合条件。 下面上代码&…

【C++】容器对象作为函数参数传递时,如何保证外部容器对象不被修改(以vector为例)

几种传参方式简单对比 传值 1.1 参数形式&#xff1a;void fun(vector<int> v); 1.2 函数调用&#xff1a;fun(v); 1.3 函数内使用&#xff1a;cout << v[1]; 1.4 是否可以改变函数外对象的值&#xff1a;否 1.5 是否会调用拷贝构造函数&#xff1a;是传指针 2.1 …

Mac电脑必备:3款优质系统软件推荐

对于Mac电脑使用者来说&#xff0c;良好的系统软件是确保计算机高效运行和提升使用者体验的关键。无论是日常办公、娱乐还是创意设计&#xff0c;一系列优质的系统软件都能为使用者带来更顺畅、更便捷的操作体验。在本文中&#xff0c;我们将推荐3款在Mac电脑上必备的优质系统软…