文章目录

  • 题目分析
  • 题目链接

题目分析



来源:acwing
分析:dijkstra求单源最短路的题目。 只是写两遍而已,第一遍求按照路径长度求,第二遍按照时间最少求。 另外加一个vector路径的判断相等。

输入输出有点复杂。

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N = 510;
bool st[N],st1[N];
int n,m,S, T; //起点和终点路口编号int dist[N]; //长度
int d[N][N],c[N][N];//d是长度, c是时间
int cnt[N]; //统计路口个数
int pre1[N],pre2[N];
int sum[N];//   时间之和 //求距离最短
void dijkstra(){memset(dist, 0x3f, sizeof dist);dist[S] = 0;sum[S] = 0;for(int i = 0; i< n; i++){int t = -1;for( int j =0; j< n; j++){if(!st[j] &&(t == -1 || dist[j]<dist[t]))t = j;}st[t] =true;for(int j = 0 ;j < n; j++){if( dist[j] > dist[t] + d[t][j]){dist[j]  = dist[t] +d[t][j];//长度更新sum[j] =sum[t] + c[t][j]; //时间更新pre1[j] = t;}else if(dist[j] == dist[t] + d[t][j] && sum[j] > sum[t] + c[t][j]){sum[j] = sum[t] +c[t][j];pre1[j] = t;}}        }
}//求时间最短
void dijkstra1(){memset(sum, 0x3f, sizeof sum);sum[S] = 0;cnt[S]=1;for(int i = 0; i< n; i++){int t = -1;for( int j =0; j< n; j++){if(!st1[j] &&(t == -1 || sum[j]<sum[t]))t = j;}st1[t] =true;for(int j = 0 ;j < n; j++){if( sum[j] > sum[t] + c[t][j]){sum[j]  = sum[t] +c[t][j];//长度更新cnt[j] =cnt[t]+1;pre2[j] = t;}else if(sum[j] == sum[t] + c[t][j] && cnt[j] > cnt[t] + 1){cnt[j] =cnt[t] +1;pre2[j] = t;}}}
}int main(){memset(d, 0x3f, sizeof d); //边的长度,邻接矩阵存memset(c, 0x3f, sizeof c); //边的时间,邻接矩阵存cin >> n >> m;while(m--){ //m个街道int a ,b, flag, length , time1;cin >> a >> b>> flag >> length >>time1;if(flag == 1) //有向边d[a][b] = min(d[a][b],length),c[a][b] =min(c[a][b],time1);//无向边else d[a][b] = d[b][a] = min(d[a][b],length),c[a][b]=c[b][a] =min(c[a][b],time1);}cin >> S >> T;//起点和终点dijkstra();//保存路径vector<int> path1;for(int i = T; i!=S; i =pre1[i]) path1.push_back(i);dijkstra1();vector<int> path;for(int i = T; i!=S; i =pre2[i]) path.push_back(i);//输出//如果两个路径相同if(path1 == path){printf("Distance = %d; Time = %d: ",dist[T],sum[T]);cout<<S;for(int i =path1.size() -1; i>=0 ;i--) cout<<" -> "<<path1[i];cout<<endl;}//不相同else{printf("Distance = %d: ",dist[T]);cout<<S;for(int i =path1.size() -1; i>=0 ;i--) cout<<" -> "<<path1[i];cout<<endl;printf("Time = %d: ",sum[T]);cout<<S;for(int i =path.size() -1; i>=0 ;i--) cout<<" -> "<<path[i];cout<<endl;}
}

题目链接

PAT甲级1111 Online Map (30分)
https://www.acwing.com/problem/content/description/1603/

PAT甲级1111 Online Map (30分):[C++题解]两次dijkstra求单源最短路、保存路径、长度最短、时间最短相关推荐

  1. PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!

    文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...

  2. PAT甲级1030 Travel Plan (30分):[C++题解]dijkstra求单源最短路、保存路径

    文章目录 题目分析 题目链接 题目分析 来源:PAT网站 分析 dijkstra模板默写过来,然后多了一个保存路径,使用数组pre[N]记录最短路上每个点的前驱,通过pre数组保存到vector中 v ...

  3. PAT甲级1087 All Roads Lead to Rome (30分):[C++题解]dijkstra求单源最短路综合、最短路条数、保存路径

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 首先这是一道dijkstra算法求最短路的题目,不过此题较为复杂.首先需要将字符串城市名映射成数字,这里使用hash table 名 ...

  4. 【PAT】1111 Online Map (30 分)

    堆优化的dijkstra+第二标尺 两次权不同,互不干扰 #include <bits/stdc++.h> using namespace std; int n,m; int s1,s2; ...

  5. 1111 Online Map (30 分)【难度: 一般 / 知识点: Dijkstra最短路】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805358663417856 很传统的最短路,不过要跑两次,其实分开来的话 ...

  6. PAT甲级1072 Gas Station (30 分):[C++题解]dijkstra算法、最短路

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 所有的dist[ ]都≤Ds:最小的dist[ ]最大; dist[ ] 总和最大. 由于加油站是字符,为了简单起见,将m个加油站编 ...

  7. PAT甲级1155 Heap Paths (30 分):[C++题解]堆、堆的遍历、树的遍历、dfs输出路径、完全二叉树建树

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 堆首先是完全二叉树,所以先建完全二叉树,由于给定的是层序遍历的数据,所以直接用数组即可,注意数组下标从1开始,这样便满足结点u和左儿 ...

  8. PAT甲级1107 Social Clusters (30 分):[C++题解]并查集,爱好、人数

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 凭爱好,分人群.注意点:爱好可传递.什么意思?意思是A和B的有共同爱好1, B和C有共同爱好2,那么认为A和C也是同一群人. 按照爱 ...

  9. PAT甲级1103 Integer Factorization (30 分):[C++题解]背包问题,DP解法

    文章目录 题目分析 题目链接 题目分析 分析 把N(样例中N=169)看成背包的体积:把k(样例中k=5)看成背包能承的重量.把这道题转化为二维完全背包问题.由于数据范围给出的次幂P∈[2,7],那么 ...

最新文章

  1. bootstrap回顾
  2. 汇编语言 在存储单元中显示字符串
  3. boost::hana::contains用法的测试程序
  4. Unsupported Hardware Detected
  5. 动态表单实现客户端二次过滤及字段汇总统计
  6. linux 查看 CPU 使用率
  7. win8计算机丢失xinput1+3.dll,xinput1 3.dll丢失怎么办 win8下xinput1 3.dll丢失解决方法
  8. mysql 批量替换 所有表_[收藏]批量替换一个数据库中所有表中所有记录
  9. (228)FPGA岗位有哪些?
  10. java tcp 字节数_服务器无法接收大小超过1500字节的TCP数据包
  11. 84直方图最大矩形覆盖 · Largest Rectangle in Histogram
  12. undefined reference to 'modbus_new_tcp'
  13. Python中__init__和__del__方法介绍
  14. Ubuntu下配置JDK
  15. 幼儿园计算机游戏,幼儿园数学游戏大全(大中小班都有),不可错过!
  16. eclipse安装超帅主题----darkest dark
  17. STM32F4移植ucos_II
  18. poj1753Flip Game
  19. 面向小白visual studio 2019 添加第三方库教程
  20. 史上最全量化交易资源整理

热门文章

  1. weblogic10.3.6配置nodemanager
  2. iOS 界面上绘制不同字体 颜色 大小的字符串
  3. BZOJ-1010 玩具装箱toy (斜率优化)
  4. Javascript添加收藏夹和设为首页兼容写法
  5. JS中获得窗口属性的方法
  6. Matlab拾零(to be continued)
  7. 1. 金融数学中的随机变分法-Wiener空间与Wiener泛函
  8. STM32 基础系列教程 43 – SRAM
  9. Sphinx+gitee+Read the Docs搭建在线文档系统
  10. 在隧道内放置多个地感线圈,车辆通过时、对通过的相邻两个线圈的脉冲信号数据进行实时采集,首先利用云模型算法,计算得到车速的估计值