问题 E: 最短路径问题

简介: 问题 E: 最短路径问题

问题 E: 最短路径问题

[命题人 : 外部导入]

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


题目描述

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。


输入

输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。

(1<n<=1000, 0<m<100000, s != t)


输出

输出 一行有两个数, 最短距离及其花费。


样例输入 Copy


3 2

1 2 5 6

2 3 4 5

1 3

0 0


样例输出 Copy


9 11


分析:

这是涉及到可能存在多条最短路径的问题,题目没有要求输出路径,pre数组可以省略,直接再添加一个二维cost数组记录花费,用c数组记录满足最短路径时的最小花费,更新同dis的更新一起。由于codeup可能会输入重复边,这里采用邻接矩阵存储。

#include<algorithm>
#include<iostream>
using namespace std;
int G[1001][1001],cost[1001][1001];
int dis[1001],c[1001];
bool vis[1001];
const int inf=1000000;
void dijkstra(int n,int s){
  fill(vis,vis+n+1,false);
  fill(dis,dis+n+1,inf);
  fill(c,c+n+1,inf);
  dis[s]=0;
  c[s]=0;
  int sum=0;
  for(int i=1;i<=n;i++){
    int min =inf,u=-1;
    for(int j=1;j<=n;j++)
    {
      if(!vis[j]&&dis[j]<min)
      {
        u=j;
        min=dis[j];
      }
    }
    if(u==-1)return ;
    vis[u]=true;
    for(int j=1;j<=n;j++){
      if(!vis[j]&&G[u][j]!=inf){
         if (dis[u]+G[u][j]<dis[j]){
      dis[j]=dis[u]+G[u][j];
      c[j]=c[u]+cost[u][j]; }
      else if(dis[u]+G[u][j]==dis[j]&&c[u]+cost[u][j]<c[j])
      c[j]=c[u]+cost[u][j];
    } } 
  } 
}
int main(){
  int n, m,s,t,a,b,d,p;
    while(~scanf("%d%d ",&n,&m),n&&m)
    {
    fill(G[0],G[0]+1001*1001,inf);
        for(int i=0;i<m;++i)
        {
          scanf("%d%d%d%d",&a,&b,&d,&p);
          G[a][b]=G[b][a]=d;
          cost[a][b]=cost[b][a]=p;
    }
    scanf("%d%d",&s,&t);
    dijkstra(n,s);
    printf("%d %d\n",dis[t],c[t]);
    }
  return 0; 
}
相关文章
|
Kubernetes API 调度
容器编排工具有哪些
容器编排工具有哪些
|
JavaScript 前端开发
深入了解 Vue中$nextTick
$nextTick`是 Vue 框架中的一个函数,用于在 DOM 更新完成后执行回调函数。它的主要作用是`解决在 Vue 中修改数据后,DOM 不会立即更新的问题
|
消息中间件 IDE JavaScript
用代码画时序图!YYDS
最近通过代码来看看这个图,给大家看图、UML ,感觉很给大家分享。 大家平时用他们出的图呢,是用什么样的图,都用画图来画的,我们用画图来画图 呢draw.io?processOn 今天给大家介绍一款想要的作品,用的画图,配合IDE使用PlantUML!
用代码画时序图!YYDS
|
机器学习/深度学习 人工智能 自然语言处理
人人都能读懂的大模型入门指南 - Transformer与Attention机制
人人都能读懂的大模型入门指南 - Transformer与Attention机制
724 5
人人都能读懂的大模型入门指南 - Transformer与Attention机制
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
1546 3
|
消息中间件 网络协议 安全
C# 一分钟浅谈:WebSocket 协议应用
【10月更文挑战第6天】在过去的一年中,我参与了一个基于 WebSocket 的实时通信系统项目,该项目不仅提升了工作效率,还改善了用户体验。本文将分享在 C# 中应用 WebSocket 协议的经验和心得,包括基础概念、C# 实现示例、常见问题及解决方案等内容,希望能为广大开发者提供参考。
1256 0
|
机器学习/深度学习 数据采集 测试技术
Kaggle实战之 房价预测案例
Kaggle实战之 房价预测案例
|
缓存 Java Maven
Java--SpringBoot-13-Spring Boot Maven Plugin-04
Spring Boot Maven Plugin可以配置打包的内容,对包中的内容进行layers-分层。
482 0
Java--SpringBoot-13-Spring Boot Maven Plugin-04
|
机器学习/深度学习 人工智能 达摩院
如何打造真人化高表现力的语音合成系统
语音合成技术作为人机交互的重要环节,终极目标即达到媲美真人的合成效果。高表现力语音合成逐渐成为未来的趋势。高表现力语音有三个显著的特点:韵律自然、情感风格丰富和音质清澈。 需要认识到的是当下的技术水平在韵律自然表示、情感风格丰富度上和真人之间还存在着较大的、人耳容易分辨的差距。 因此,我们针对这三个特点,进行算法上的探索,形成达摩院第五代语音合成技术——基于韵律建模的 SAM-BERT、情感语音合成 Emotion TTS 和高清语音合成 HiFi-TTS 的 Expressive-TTS。
783 0