题目描述

题目出处:

已翻译

未翻译(原网站)

输入

输出

样例

输入
5 6
1 2 2
2 5 5
2 3 4
1 4 1
4 3 3
3 5 1
输出
1 4 3 5

样例规模

分析与思路

看到这么一个题目,我们首先想到使用Dijkstra算法,但是,当我们看到数据规模是,不难发现:若使用Dijkstra算法,会导致内存超限
那么能否使用Bellman-Ford 算法呢?答案是否定的,如果使用了Bellman-Ford 算法,由于处理数据太多,会导致超时,最后喜提TLE
那怎么办?我们应如何在这种情况下选择合适的算法呢?

换个想法

换一个想法,我们可以想办法解决这两个算法在实现时出现的问题。
先来看看Bellman-Ford 算法,由于Bellman-Ford 算法的工作原理是计算所有点到起点的距离,所以缩短运行时间并不可取
那么我们只能选择Dijkstra算法来解决这个问题,那么如何减少Dijkstra算法的内存占用呢,让我们先看看Dijkstra算法的内存是如何使用的。

const int MXV=0x3f3f3f3f;
const int MXN=1e4+5;
bool flag[MXN+1];//记录每个顶点到起点的最短路径是否已经计算过
int dist[MXN+1];//记录一个顶点到起点的距离
int bi[MXN+1][MXN+1];//记录每条边的边权
vector<int>edges[MXN+1];//记录两顶点之间的关系,是否有边连接两顶点

不难发现,上述代码中,对于边的处理(是否有,边权是多少)占用了很大一部分内存,只要能将二者合二为一,就可以减少对内存的使用

如下为改造过后的部分

const int MXV=0x3f3f3f3f;
const int MXN=1e5+5;
bool flag[MXN+1];
long long dist[MXN+1];
int n,m,u,v,w;
struct Node{long long id,dist;Node(){}Node(int i,int d){id=i;dist=d;}friend bool operator < (Node a,Node b){return a.dist>b.dist;}
};
vector<Node>g[MXN+4];//代替了上述部分bi和edges

这样,我们就成功减少了内存的消耗,接下来只要按照这个想法往下写,就可以轻松解决这个问题了

代码实现

#include<bits/stdc++.h>
using namespace std;const int MXV=0x3f3f3f3f;
const int MXN=1e5+5;
bool flag[MXN+1];
long long dist[MXN+1];
int n,m,u,v,w;
int ljing[MXN+1];
int jingl[MXN+1];
struct Node{long long id,dist;Node(){}Node(int i,int d){id=i;dist=d;}friend bool operator < (Node a,Node b){return a.dist>b.dist;}
};
priority_queue<Node>pque;
vector<Node>g[MXN+4];void Dijkstra(int sid){memset(dist,0x3f,sizeof(dist));dist[sid]=0;pque.push(Node(sid,dist[sid]));while(pque.size()){Node from=pque.top();pque.pop();if(flag[from.id])continue;flag[from.id]=true;for(int i=0;i<g[from.id].size();i++){int to=g[from.id][i].id;if(!flag[to] && dist[to]>dist[from.id]+g[from.id][i].dist){dist[to]=dist[from.id]+g[from.id][i].dist;pque.push(Node(to,dist[to]));ljing[to]=from.id;}}}
}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&w);g[u].push_back(Node(v,w));g[v].push_back(Node(u,w));}Dijkstra(1);if(flag[n]!=true){printf("-1");return 0;}else{int op,ui=n,ip=0;while(ui!=1){op=ljing[ui];jingl[++ip]=op;ui=op;}for(int i=ip;i>=1;i--)printf("%d ",jingl[i]);printf("%d ",n);}return 0;
}

CF20C Dijkstra?相关推荐

  1. CF20C Dijkstra?( Dijkstra!练手)难度⭐⭐⭐

    题意翻译 题目大意 给出一张图,请输出其中任意一条可行的从点 11 1 到点 nn n 的最短路径. 输入输出格式 输入格式 第一行:两个整数n,m,分别表示点数和边数 接下来m行:每行三个整数u,v ...

  2. [C] Dijkstra算法——通过边实现松弛

    Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...

  3. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  4. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  5. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  6. Acwing--朴素dijkstra

    #include <iostream> #include <cstring> using namespace std;/* 优点:可以求得[n]到任一点的最短距离;可以输入最短 ...

  7. Dijkstra(迪杰斯特拉)算法简介

    目录 适用情形 思想 核心代码 设计实现更多功能 举例说明 适用情形 适用于权值为非负的图的单源最短路径 思想 在已知起点与终点的情况下.须有三个一维数组S,U,dis,S用于记录已经查找过的点,U则 ...

  8. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  9. 最短路径 - dijkstra

    dijkstra是单源点最短路算法. 借图: 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 初始时,S中仅含有源.设u是G的 ...

最新文章

  1. 马化腾:人工智能的“大社交”时代
  2. c语言如何初始化随机数种子,关于随机数函数rand和其种子初始化
  3. 磁盘格式化与快速格式化有什么区别?
  4. Python 程序打包 -- 使用pyinstaller
  5. api代理提取_了解提取API
  6. 文件服务器搭建_小型企业文件存储服务器的搭建四部曲
  7. java 蓝桥杯算法训练 整除问题(题解)
  8. java 语言实现随机数
  9. mysql参数优化步骤_MySQL架构优化实战系列4:SQL优化步骤与常用管理命令2(转)
  10. Java ListIterator 与 Iterator 异同
  11. 实战 Kaggle 比赛:狗的品种识别(ImageNet Dogs) 动手学深度学习v2 pytorch
  12. linux硬盘支持fat32,Linux下,挂载windows管理格式的FAT32/NTFS 硬盘
  13. 新媒体营销方式的优势
  14. android动态化ui框架,简单实用的Android UI微博动态点赞效果
  15. tpshop带微分销_TPshop分销商城的分销模式
  16. 2022年G2电站锅炉司炉考试题库及模拟考试
  17. 理论+股市数据实战,总结了五种常用聚类分析算法
  18. HTML页面SVG的使用
  19. showdoc内容备份
  20. java poi 将公文套红 并 电子签章

热门文章

  1. svg 可视化可爱表情包
  2. 准确率,召回率,F1 值、ROC,AUC、mse,mape评价指标
  3. 手机海豚模拟器怎么添加游戏_af飞行模拟器手机版下载-af飞行模拟器中文游戏手机版 v20.20.17...
  4. android 自定义仿qq点赞动画
  5. SpringBoot - @JsonFormat注解详解
  6. ​国务院机构改革方案的学习
  7. 微信钱包突然显示服务器关闭,微信里的钱突然消失?赶紧的吧,你需要关闭这个功能,不然血亏!...
  8. 对于互联网金融大战,第三方基金销售也成了参与者 数米、好买接连参战
  9. 【火狐打不开百度首页】解决方法
  10. javascript 及 vue 中的变量前面的美元符号 $ 是什么意思