问题 D: 最短路径

简介: 问题 D: 最短路径

问题 D: 最短路径

[命题人 : 外部导入]

时间限制 : 1.000 sec 内存限制 : 32 MB


题目描述

有n个城市m条道路(n<1000, m<10000),每条道路有个长度,请找到从起点s到终点t的最短距离和经过的城市名。


输入

输入包含多组测试数据。


每组第一行输入四个数,分别为n,m,s,t。


接下来m行,每行三个数,分别为两个城市名和距离。


输出

每组输出占两行。


第一行输出起点到终点的最短距离。


第二行输出最短路径上经过的城市名,如果有多条最短路径,输出字典序最小的那条。若不存在从起点到终点的路径,则输出“can’t arrive”。


样例输入 Copy

3 3 1 3

1 3 3

1 2 1

2 3 1

样例输出 Copy

2

1 2 3


分析:

该题是涉及多条最短路径的最短路径问题,由于要输出最短路径,pre定义成vector<int>型数组,在采用dfs遍历最短路径时考虑字典序问题,典型的Dijkstra+Dfs应用。

值得注意一点,据说这题可能会输入重复的边,所以用邻接表在codeup上只能拿50分,建议直接用邻接矩阵。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxv=1001;
const int inf=10000000;
struct node{
  int v,weight;
};
vector<node>Adj[maxv] ;
bool vis[maxv];
int dis[maxv];
vector<int>pre[maxv];//记录路径 
//dijkstra算法
void dijkstra (int n,int s) {
  fill(vis,vis+n+1,false);
  fill(dis,dis+n+1,inf); //初始化dis和vis
  dis[s] =0;//这里求零点到各点最短距离
  for(int i=0;i<n;i++) //循环n次
  {    
      int min=inf,u=-1;
    for(int j=1;j<=n;j++) 
     //找最短距离点 ,这里可以用优先队列存储dis下标更快 
    {
      if(!vis[j]&&dis[j]<min)
      {
        u=j;
        min=dis[j];
      }
    }
    if(u==-1) return ;//没有找到 
    vis[u] =true;//标记已经找到的u 
    for(int j=0;j<Adj[u].size();j++) //更新dis 
    {
      int x=Adj[u][j].v;
      if(!vis[x])
      {
        if(dis[u]+Adj[u][j].weight<dis[x]){
        dis[x]=dis[u]+Adj[u][j].weight;
        pre[x].clear();
        pre[x].push_back(u);}
        else if(dis[u]+Adj[u][j].weight==dis[x])
        pre[x].push_back(u);
      }
  } 
} 
}
vector<int>path,temppath; 
void dfs(int s,int t){
  if(t==s){
    temppath.push_back(t);
    int k=1,a=path.size(),b=temppath.size();
    if(a){
      while(a>0&&b>0){
        if(temppath[b--]>path[a--]){
          k=0;break;
  }
  if(temppath[b]<path[a])break;
}
    }
    if(k)path=temppath;
    temppath.pop_back();
    return;
  }
    temppath.push_back(t);
  for(int i=0;i<pre[t].size();i++)
  {
    dfs(s,pre[t][i]);
  }
  temppath.pop_back();
}
int main(){
  int n,m,s,t;
  int x,y,w;
  node temp;
  scanf("%d%d%d%d",&n,&m,&s,&t);
  for(int i=0;i<m;i++){
    scanf("%d%d%d",&x,&y,&w); 
    temp.weight=w;
    temp.v=x;
    Adj[y].push_back(temp);
    temp.v=y;
    Adj[x].push_back(temp);
  }
  dijkstra(n,s);
  if(dis[t]==inf)printf("can't arrive\n");
  else {
    dfs(s,t);
    printf("%d\n",dis[t]);
  for(int i=path.size()-1;i>=0;--i)printf("%d ",path[i]);}
  return 0;
}
相关文章
|
6月前
|
监控 安全 数据安全/隐私保护
阿里云 | KMS密钥跨账号共享
本文介绍了在阿里云Landing Zone环境下,通过RAM授权实现KMS密钥跨账号共享的方法。该方案以Security账号为核心管理密钥,各应用账号按需获取权限,无需共享KMS实例,提升了安全性与管理效率。内容涵盖共享原理、操作步骤、管理策略及注意事项,适用于多部门协同的企业场景,助力企业实现安全合规的数据加密管理。
261 5
阿里云 | KMS密钥跨账号共享
|
11月前
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
12647 46
|
9月前
|
人工智能 供应链 数据挖掘
销售易CRM:深度赋能制造业,驱动产业链升级
销售易CRM是国内领先的客户关系管理系统,助力制造业从传统模式向智能化、服务化转型。通过全链路客户旅程管理,提升客户生命周期价值;智能数据分析赋能精准决策;跨部门协作打破信息孤岛;持续技术创新如AI、大数据等优化系统功能。以某机械制造企业为例,客户满意度提升30%,复购率增长20%。销售易CRM成为制造业数字化转型的坚实伙伴,推动企业迈向卓越运营,在竞争中脱颖而出。
|
并行计算 PyTorch Linux
大概率(5重方法)解决RuntimeError: CUDA out of memory. Tried to allocate ... MiB
大概率(5重方法)解决RuntimeError: CUDA out of memory. Tried to allocate ... MiB
10282 0
|
传感器 物联网 定位技术
浅谈蓝牙演进之路:从诞生到普及
蓝牙技术是一种支持设备间短距离通信的低功耗无线电技术,广泛应用于移动通信、消费电子、汽车电子、医疗健康等领域。自1994年由爱立信公司创制以来,蓝牙技术经历了多个版本的迭代,从最初的蓝牙1.0到最新的蓝牙5.4,不断优化传输速率、通信距离、功耗和安全性。未来,蓝牙技术将在低功耗、高速度、广覆盖等方面继续发展,拓展更多应用场景,如智能家居、可穿戴设备、工业物联网等。
|
API
万年历[取当日信息]免费API接口教程
此API提供万年历当天的详细信息,包括农历、星期、宜忌、生肖、星座、节日、五行、星宿等。支持POST和GET请求,需提供用户ID和KEY。返回数据包含阳历、农历、干支、节日列表等多项内容。示例URL:https://cn.apihz.cn/api/time/getday.php?id=88888888&key=88888888。
3899 10
|
XML 关系型数据库 MySQL
MySQL 导出某些数据的技术详解
MySQL 导出某些数据的技术详解
591 3
|
Linux 虚拟化
Vmware 傻瓜式安装(不可不知道的Linux基础知识和技术 01)
本文介绍了VMware虚拟机的下载与安装步骤。首先,通过提供的网盘链接下载VMware安装包。接着,详细描述了安装流程,包括接受协议、选择安装路径(建议避免系统C盘)、取消更新选项等。最后,输入许可证密钥完成安装,并展示了打开虚拟机后的主界面。整个过程简单易懂,适合新手操作。
427 1
|
算法 数据可视化 机器人
ROS2教程01 ROS2介绍
本文是ROS2(机器人操作系统的下一代)的介绍教程,内容包括ROS2的诞生背景、核心功能、特点、框架以及与ROS1的比较。文章涵盖了ROS2的通信系统、框架和工具、生态系统、全球性社区支持、完全开源、跨平台特性、多机协同能力、实时系统支持和更强的稳定性。此外,还提供了ROS2架构的详细介绍资源链接,适合对ROS2感兴趣的读者学习和了解。
2081 1
|
分布式计算 资源调度 Hadoop
Spark 中的集群管理器类型详解
【8月更文挑战第14天】
299 4