L2-001 紧急救援

  • 题目
  • 代码

题目

L2-001 紧急救援 (25 分)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:
输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。

第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:
第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例:

2 60
0 1 3

代码

#include<iostream>
#include<cstring>
using namespace std;
int n,m,c1,c2;
int f[510]; //记录途径那些点
int dist[510],cn[510],sum[510],rshu[510];
int mp[510][510];
bool st[510];
void print(int c2,int c1)
{if(c2==c1){cout<<c2;//终点就是起点,最后会递归到这一步再开始回溯 return ;}print(f[c2],c1);//f[]最后是最后的点,所以得倒着找点 cout<<" "<<c2;
}
void dijkstra()
{memset(dist,0x3f,sizeof dist);dist[c1]=0,cn[c1]=1,sum[c1]=rshu[c1];//确定起始顶点编号,条数(起点到其本身方式为1),人数 for(int i=0;i<n;i++){int t=-1;for(int j=0;j<n;j++){if(!st[j]&&(t==-1||dist[t]>dist[j]))t=j;}st[t]=1;for(int j=0;j<n;j++)//确定t后更新各个点的最短路//dist[j]=min(dist[j],dist[t]+mp[t][j]);{if(dist[j]>dist[t]+mp[t][j]){f[j]=t;//j的上一个点是tdist[j]=dist[t]+mp[t][j];
//从起点走到路径j的数量,j的最短路径条数得算上j的前一个点的最短路径条数(方式等于到达前驱的方式) cn[j]=cn[t];sum[j]=sum[t]+rshu[j]; }else if(dist[j]==dist[t]+mp[t][j])//如果两者最短路一样{if(sum[j]<sum[t]+rshu[j]){f[j]=t; // j的上一个点是tsum[j]=sum[t]+rshu[j];}cn[j]=cn[t]+cn[j];//合并路径数量,两种方式距离相等,则方式数相加//sum[j]=max(sum[j],sum[t]+rshu[j]); //比较人数,选那个人多的点u}}}
}
int main()
{cin>>n>>m>>c1>>c2;for(int i=0;i<n;i++)cin>>rshu[i];memset(mp,0x3f,sizeof mp);int x,y,d;for(int i=0;i<m;i++){cin>>x>>y>>d;mp[x][y]=mp[y][x]=min(mp[x][y],d);//无向图对称 不写这个12分}dijkstra();cout<<cn[c2]<<" "<<sum[c2]<<endl;print(c2,c1);return 0;
}

####洛谷3371 70分 出现MLE:Memory Limit Exceeded,超出内存限制

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,s;
int ju[10010][10010];
int dist[10010];
bool b[10010];
int main()
{cin>>n>>m>>s;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ju[i][j]=0x3f3f3f3f;//memset(ju,0x3f,sizeof ju);while(m--){int x,y,w;cin>>x>>y>>w;//ju[x][y]=w;不对,不能处理重复边的出现  4 2 49  和4 2 214 ju[x][y]=min(ju[x][y],w); //如果发生重边的情况则保留最短的一条边}for(int i=1;i<=n;i++)dist[i]=0x3f3f3f3f;//memset(dist,0x3f,sizeof dist);会超时 dist[s]=0;for(int i=1;i<=n;i++){int t=-1;for(int j=1;j<=n;j++)if(b[j]==0&&(t==-1||dist[t]>dist[j]))t=j;b[t]=1;for(int j=1;j<=n;j++)dist[j]=min(dist[j],dist[t]+ju[t][j]);}for(int j=1;j<=n;j++){//2^31=2147483648   2^31-1=2147483647if(dist[j]==0x3f3f3f3f){cout<<2147483647<<" ";continue;}cout<<dist[j]<<" ";}return 0;
}

####通过代码

#include<iostream>
using namespace std;
long long dis[10100];//防止相加后溢出
int u[500100],v[500100],w[500100],n,m,s,check;//我们定义一个check,优化用
const int inf=2147483647;//注意不能是999999999人家要不连通的输出2的31次方-1
int main()
{cin>>n>>m>>s;//输入 for(int i=1;i<=m;i++)cin>>u[i]>>v[i]>>w[i];//读入边 for(int i=1;i<=n;i++)dis[i]=inf;//dis数组初始化 dis[s]=0;for(int k=1;k<=n-1;k++)//核心代码:可以解决带负权边的图,外循环循环n-1次n为顶点个数 {check=0;//check归零 for(int i=1;i<=m;i++)//内循环m次m是边的个数,即枚举每一条边 {//遍历看是否可以通过 u[i]让1号顶点直接到 v[i]的距离变小 if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];check=1;//如果dis数值改变,check赋值为1 }  }if(check==0)break;//如果没变,直接跳出循环,不要浪费时间 }for(int i=1;i<=n;i++)cout<<dis[i]<<" ";//输出 return 0;
}

L2-001 紧急救援 (25 分)最短路径 迪杰斯特拉算法相关推荐

  1. >算法笔记-动态规划-最短路径迪杰斯特拉算法

    算法笔记-动态规划-最短路径迪杰斯特拉算法 作者:星河滚烫兮 前言   图的最短路径问题在现实生活中有很广阔的应用,最短路径又分为单源最短路径与多源最短路径,前者求出固定起点到其他节点的最短路径,后者 ...

  2. 最短路径——迪杰斯特拉算法——图的数据结构

    最短路径是在工程上经常用到的概念,在这里给出了从单源点到任意顶点的迪杰斯特拉算法. 先来看看基本概念: 用代码C语言实现如下: #include<string.h>#include< ...

  3. 最短路径迪杰斯特拉算法--邻接矩阵

    一.算法介绍 迪杰斯特拉算法(解决单源最短路径) 基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径. 基本步骤:1,设置标记数组bo ...

  4. 别说了,世界那么大我想去看看!(最短路径-迪杰斯特拉算法弗洛伊德算法)

    前言: 一直想去外面的世界看看,中国城市那么多,那么美,怎么样才可以用最少的钱,最短的时间游遍我想去的城市呢?(我在做梦?不不不!迪杰斯特拉算法和弗洛伊德算法来了)      这两个算法有着广泛的用途 ...

  5. 校园导游系统(纯C语言实现)最短路径---迪杰斯特拉算法

    西京学院导游系统 学习数据结构+C语言可实现 #include <stdio.h> #include <stdlib.h> #include <conio.h> # ...

  6. 最短路径迪杰斯特拉算法 c语言,Dijkstra第K最短路径算法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //运筹学之最短路径 #include #include #define M 99999 int main() { int G[100][100]; in ...

  7. java 点到点最短路径,迪杰斯特拉算法处理无向图中最短路径的(dijkstra)Java实现(指定两点,求最短距离及路径) | 学步园...

    其实不是原创哈,我写不出来. 如何求图中V0到V5的最短路径呢? java实现的方式如下: 第一步,根据图来建立权值矩阵: int[][] W = { {  0,   1,   4,  -1,  -1 ...

  8. 图的最短路径--迪杰斯特拉算法 c语言

    还是按照书上的例子: 完整代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #def ...

  9. (王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想、代码、演示、答题规范)

    文章目录 一:BFS算法局限性 二:迪杰斯特拉(dijkstra)算法基本思想 三:迪杰斯特拉(dijkstra)算法代码实现 四:迪杰斯特拉(dijkstra)算法代码视频演示 五:迪杰斯特拉(di ...

最新文章

  1. 遭遇错误:ORA-01031
  2. es最新的集群选举策略
  3. 跨界会对电商行业造成什么影响
  4. HTML简介与历史版本
  5. 靠谱测试人员需具备沟通表达能力
  6. UnityShader1:渲染流水线
  7. idea配置Lua环境
  8. 40套各种风格住宿酒店行业网站html5模板大气商务酒店网站模板度假村酒店官方网站模板旅行酒店宾馆整站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响应
  9. C语言-字符型数据与ASCII码表
  10. 三菱触摸屏u盘上传和下载_威纶通TK6070iQ触摸屏通过U盘下载的详细步骤
  11. vue仿微博评论回复_vue教程2-07 微博评论功能
  12. 5款好看的WordPress博客主题下载
  13. 应用中安装第三方apk的两种方法:利用Intent跳转安装页面、利用PackageInstaller静默安装
  14. 8个接私活的网站,只要你有码,那就有钱!
  15. 智慧实验室LIMS系统真的有必要建设吗?
  16. terracotta安装配置与集群过程
  17. 判断ip地址是否在同一网段
  18. 优雅のJava(五)—— 优雅的观察对象与订阅信息 观察者模式 好莱坞原则
  19. Unity PIC 打包assetBundle报错
  20. [转] Scalers:刻意练习的本质就是持续行动+刻意学习

热门文章

  1. 网易游戏虚拟世界架构师面试经验
  2. 啃完吃透保你涨薪5K
  3. EXCEL 2016:IF如何表示逻辑与、逻辑或
  4. LTE资源调度(4)-上行资源申请方式和BSR缓存状态报告
  5. 专升本C语言试题分析(一)
  6. python怎么判断日期是星期几_python数据统计告诉你,是不是周四周五会跌的比较多...
  7. Python面向对象—面向对象高级
  8. 计算机电源三个方面,选择计算机电源要注意什么?
  9. 拒绝抑郁,情绪调节,逆境治愈!
  10. 委托站点中的MIP、RMPN、UMPN、IMEI、IMSI、分别代表是什么意思?