【算法】新年好(堆优化dijkstra)

news2024/11/24 20:10:41

题目 

        重庆城里有 n 个车站,m 条 双向 公路连接其中的某些车站。

        每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。

        在一条路径上花费的时间等于路径上所有公路需要的时间之和。

        佳佳的家在车站 1,他有五个亲戚,分别住在车站 a,b,c,d,e。

        过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。

        怎样走,才需要最少的时间?

输入格式

        第一行:包含两个整数 n,m,分别表示车站数目和公路数目。

        第二行:包含五个整数 a,b,c,d,e,分别表示五个亲戚所在车站编号。

        以下 m 行,每行三个整数 x,y,t,表示公路连接的两个车站编号和时间。

输出格式

        输出仅一行,包含一个整数 T,表示最少的总时间。

数据范围

1 ≤ n ≤ 50000
1 ≤ m ≤ 10^5
1 < a,b,c,d,e ≤ n
1 ≤ x , y ≤ n
1 ≤ t ≤ 100

思路

样例:
6 6
2 3 4 5 6
1 2 8
2 3 3
3 4 4
4 5 5
5 6 2
1 6 7

根据样例,我们可以得到一张图: 

 

因为数据范围:

1 ≤ n ≤ 50000
1 ≤ m ≤ 10^5

我们可知这是一张稀疏图,我们可以使用邻接矩阵进行存储。

我们可以进行6次堆优化版的dijkstra算法,依次求出佳佳与五个亲戚到其他点的最小距离。

        当我们得到佳佳与五个亲戚到其余点的最小距离之后,我们可以考虑使用深度搜索去搜索佳佳拜访五位亲戚的顺序,并保留这些顺序中的最小值。

 

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 50010,M = 200010,INF = 0x3f3f3f3f;
typedef pair<int,int> PII;
int n,m;
int source[6];
int h[N],e[M],w[M],ne[M],idx;
int q[N],dist[6][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 ++;
}

void spfa(int start,int dist[])
{
    memset(dist,0x3f,N * 4);
    dist[start] = 0;
    priority_queue<PII,vector<PII>,greater<PII>> heap;
    heap.emplace(0,start);
    while(!heap.empty())
    {
        auto t = heap.top();
        heap.pop();
        int x = t.second;
        for(int i = h[x]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dist[j] > dist[x] + w[i])
            {
                dist[j] = dist[x] + w[i];
                heap.emplace(dist[j],j);
            }
        }
    }
}

int dfs(int u,int start,int distance)
{
    if(u == 6) return distance;
    int res = INF;
    for(int i = 1; i <= 5; i++)
        if(!st[i])
        {
            int next = source[i];
            st[i] = true;
            res = min(res,dfs(u + 1,i,distance + dist[start][next]));
            st[i] = false;
        }
    return res;
}

int main()
{
    scanf("%d%d",&n,&m);
    source[0] = 1;
    for(int i = 1; i<= 5; i ++) scanf("%d",&source[i]);
    memset(h,-1,sizeof(h));
    while(m --)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c),add(b,a,c);
    }
    for(int i = 0; i < 6; i ++) spfa(source[i],dist[i]);
    cout << dfs(1,0,0) << endl;
    return 0;
}

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

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

相关文章

选择困难症的我,最终选择了Amazon EC2 云服务器

前言 作为一名开发者&#xff0c;如果要部署一个自己的网站&#xff0c;选择一个好的服务器是非常重要的。本文依据我个人使用服务器的经验&#xff0c;给大家在选择时一些建议。我非常推荐大家使用 Amazon EC2 云服务器。 Amazon EC2 云服务器 提供了最广泛、最深入的计算平…

yum提示Another app is currently holding the yum lock

打算centos 7配置一下docker&#xff0c;报错了&#xff0c;yum提示Another app is currently holding the yum lock; waiting for it to exit... 可能是系统自动升级正在运行&#xff0c;yum在锁定状态中。已经有一个yum进程在运行了&#xff0c;使用kill干掉它&#xff1a; …

【DevChat】智能编程助手,告别敲代码烦恼,从此爱上AI编程

&#x1f50e;官方网站&#xff1a;https://www.devchat.ai/ 文章目录 一、DevChat介绍&#x1f447;二、DevChat优势&#x1fa81;三、DevChat注册流程篇&#x1f380;四、DevChat使用教程篇&#x1f4e2;1. DevChat插件安装配置⚒️2. 与DevChat问答交流&#x1f523;3. DevC…

【Kotlin精简】第7章 泛型

1 泛型 泛型即 “参数化类型”&#xff0c;将类型参数化&#xff0c;可以用在类&#xff0c;接口&#xff0c;函数上。与 Java 一样&#xff0c;Kotlin 也提供泛型&#xff0c;为类型安全提供保证&#xff0c;消除类型强转的烦恼。 1.1 泛型优点 类型安全&#xff1a;通用允许…

分享68个工作总结PPT,总有一款适合您

分享68个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1juus0gmesBFxJ-5KZgSMdQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

【数据结构】数组和字符串(十五):字符串匹配2:KMP算法(Knuth-Morris-Pratt)

文章目录 4.3 字符串4.3.1 字符串的定义与存储4.3.2 字符串的基本操作4.3.3 模式匹配算法0. 朴素模式匹配算法1. ADL语言2. KMP算法分析3. 手动求失败函数定义例1例2例3 4. 自动求失败函数&#xff08;C语言&#xff09;5. KMP算法&#xff08;C语言&#xff09;6. 失败函数答案…

思维模型 凡勃伦效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。为什么有些人愿意为高价商品买单&#xff1f;请看凡勃伦效应。 1 凡勃伦效应的应用 1.1 奢侈品市场中的凡勃伦效应 茅台酒&#xff1a;茅台酒是中国的一种高档白酒&#xff0c;价格非常昂…

在本地安装LLAMA 2

方法一&#xff1a; Meta已将llama2开源&#xff0c;任何人都可以通过在meta ai上申请并接受许可证、提供电子邮件地址来获取模型。 Meta 将在电子邮件中发送下载链接。 下载llama2 获取download.sh文件&#xff0c;将其存储在mac上打开mac终端&#xff0c;执行 chmod x ./do…

namespace

1.namespace技术 namespace是Linux内核的一组特性&#xff0c;支持对内核资源进行分区隔离&#xff0c;让一组进程只能看到一组资源&#xff0c;而另一组进程只能看到另一组不同的资源。换句话说&#xff0c;namespace的关键特性是进程隔离。在运行许多不同服务的服务器上&…

计网【链路带宽100Mbps代表什么,“翻译”成人话是?】

这里写目录标题 带宽的概念本来的意思【通信领域】计网中的意思 结论【100Mbps代表什么】 带宽的概念 本来的意思【通信领域】 带宽这个概念本来是通信领域的&#xff0c;表示通信线路允许通过的信号频带范围&#xff0c;单位是赫兹Hz 感觉最简单的意思&#xff0c;例如如果…

Javascript知识点详解:数组、Array 对象

目录 数组 定义 数组的本质 对象有两种读取成员的方法&#xff1a; length 属性 in 运算符 for...in 循环和数组的遍历 数组的空位 类似数组的对象 Array 构造函数 静态方法 Array.isArray() 实例方法 valueOf()&#xff0c;toString() push()&#xff0c;pop(…

ruby、Python 以及 Swift 语言关于 “Finally” 实现的趣谈

0. 概览 结构化代码语义是任何语言入门之必备基本功&#xff0c;想写出“意大利面条”似的美味代码么&#xff1f;直接干就对了&#xff01; 虽然上面有些“话糙理不糙”&#xff0c;但不可否认的是现今几乎所有高级语言都对代码结构化语义提供了良好的支持。入门码农们的第一…

循环队列练习

循环队列练习 相关内容&#xff1a; 1.队列顺序存储的不足 2.循环队列&#xff08;队列头尾相接的顺序存储结构&#xff09; //队列的初始化、入队、出队、取对头、计算队长度 #include<stdio.h> #define MAXSIZE 10 typedef int Status; #define OK 1 #define ERROR 0…

虚幻C+++基础 day2

角色移动与视角控制 Character类与相关API 创建Character子类MainPlayer.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "GameFramework/Character.h" #include &q…

centos7.0+最快速安装docker的方法

先安装yum工具&#xff0c;然后添加阿里云的docker仓库&#xff0c;然后yum安装&#xff0c;然后启动 安装yum-config yum install yum-utils -y yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce do…

一款简单而强大的文档翻译网站

一款文字/文件翻译的网站,支持多个领域的翻译&#xff0c;支持常见的语言翻译(韩/日/法/英/俄/德…),最大百分比的保持原文排版(及个别除外基本100%还原)。 新用户注册就有100页的免费额度&#xff0c;每月系统还会随机赠送翻译额度&#xff0c;说实话这比好多的企业要好的多了…

为什么没有面试机会?是因为你没有掌握这套完整的性能测试流程,

一、准备工作 在什么阶段开展性能测试工作&#xff1f;一般情况下&#xff0c;是在被测系统已完成功能测试、系统趋于稳定的情况下&#xff0c;才会进行性能测试。 1. 组建测试团队 根据被测系统的实际情况&#xff0c;组建一个性能测试团队&#xff0c;团队成员包括&#xff…

CUMT-----Java课后第五章编程作业

文章目录 一、题11.1 问题描述1.2 代码块1.3 运行截图 二、题22.1 问题描述2.2 代码块2.3 运行截图 一、题1 1.1 问题描述 (1)使用继承编写人类、教师、学生类的实体类。(2)编写测试类&#xff0c;实例化教师和学生类对象并显示。 1.2 代码块 public class Human {private S…

镭神智能C16的ROS驱动的安装方法

原文链接 前言 激光雷达赶上了自动驾驶了浪潮&#xff0c;国产激光雷达也越来越多。 最近团队要购买激光雷达&#xff0c;正好拿镭神智能的产品测试一下&#xff0c;安装驱动是首先要做的&#xff0c;因此在这里记录一下。 产品说明&#xff1a;http://www.leishen-lidar.com…

multiple kernel learning(MKL)多核学习

历史上之所以会出现多核学习&#xff08;MKL&#xff09;这个词&#xff0c;是因为在深度学习流行起来以前&#xff0c;kernel是处理非线性的默认方法&#xff0c;那个年代优化一个非线性函数不容易&#xff0c;每加一层复杂性可能就需要多设计一个优化算法&#xff0c;MKL就是…