题目:

本题使用Dijkstra算法,但在模板上进行了一定的扩展,是一道不错的最短路题目。

AC代码:

 1 #include<iostream>
2 #include<cmath>
3 #include<map>
4 #include<cstring>
5 #include<string>
6 using namespace std;
7 int n,m,start,ed;
8 int p[550];//550是防止越界,也可以写510什么的,看个人习惯
9 int g[550][550];
10 int cnt[550],sum[550];//cnt 是最短路径数 sum是救援队数量
11 bool st[550];//标志这个点是否抵达过
12 int f[550];//记录的是经过的点,这题可以理解成记录下标
13 int dist[550];
14 void print(int start,int ed)
15 {
16 if(ed==start)
17 {
18 cout<<start;
19 return;//起点就是终点
20 }
21 print(start,f[ed]);//递归不断回去,注意用DFS思想,从深向浅递归
22 cout<<" "<<ed;
23 }
24 void dj()
25 {
26 memset(dist,0x3f,sizeof dist);
27 dist[start]=0,cnt[start]=1,sum[start]=p[start];//初始化
28 for(int i=0;i<n;i++)
29 {
30 int t=-1;
31 for(int j=0;j<n;j++)
32 {
33 if(!st[j]&&(t==-1||dist[t]>dist[j])) t=j;//取最短点
34 }
35 st[t]=true;
36 for(int j=0;j<n;j++)
37 {
38 if(dist[j]>dist[t]+g[t][j])//就是最短路变化
39 {
40 f[j]=t;//记录路径,从t到j
41 dist[j]=dist[t]+g[t][j];//变化最短路
42 cnt[j]=cnt[t];//变化次数
43 sum[j]=sum[t]+p[j];//最短路径变化后
44 }
45 else if(dist[j]==dist[t]+g[t][j])
46 {
47 if(sum[j]<sum[t]+p[j])//救援队少的时候,变化路径
48 {
49 f[j]=t;
50 sum[j]=sum[t]+p[j];
51 }
52 cnt[j]=cnt[j]+cnt[t];//两个最短路方式的相加
53 }
54 }
55 }
56 }
57 int main()
58 {
59 cin>>n>>m>>start>>ed;
60 for(int i=0;i<n;i++) cin>>p[i];
61 memset(g,0x3f,sizeof g);//设现在每一个城市间为正无穷的距离
62 for(int i=0;i<m;i++)
63 {
64 int a,b,c;
65 cin>>a>>b>>c;
66 g[a][b]=g[b][a]=min(g[a][b],c);//防止重边
67 }
68 dj();
69 cout<<cnt[ed]<<" "<<sum[ed]<<endl;
70 print(start,ed);
71 return 0;
72 }

最新文章

  1. js获取页面url的方法
  2. PureBasic—数控编辑框与调节块和进度条
  3. html网页标题
  4. 移动端 js touch事件
  5. 在asp.net mvc中将checkbox传到后台时总是true的解决方法
  6. tail -f logfile.log 一直监控某个文件,若该文件有改动,立即在屏幕上输出
  7. 用Natvis定制C++对象在Visual Studio调试时如何显示
  8. MySQL 一些小知识
  9. Sort List 分类: leetcode 算法 2015-07-10 15:35 1人阅读 评论(0) 收藏
  10. 大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网
  11. 【高德地图API】从零开始学高德JS API(六)——坐标转换
  12. js,jQuery和DOM操作的总结(二)
  13. ovs + kernel datapath 的分片与重组流程
  14. 【OCR技术系列之一】字符识别技术总览
  15. TDD入门demo
  16. Kafka基本知识回顾及复制
  17. zipline-- 开发指南
  18. 我的 OneNote 入门心得
  19. 在Java中使用Socket模拟客户端和服务端(多线程)
  20. Flex布局兼容知识点总结

热门文章

  1. 千兆网数据CRC检验和过滤
  2. 8元电调调参教程(使用Arduino Uno)| BLHeli无刷电调的固件烧写及调参
  3. 什么是 Spring Profiles?
  4. 学习 MongoDB(一)
  5. Centos最小化安装
  6. 学习Redis(三)
  7. 什么是CSS Modules ?我们为什么需要他们
  8. 驳《我不是很懂 Node.js 社区的 DRY 文化》
  9. Linux 0.11源码阅读笔记-高速缓冲
  10. 关于sqlite数据库与sqlite studio