当前位置:网站首页>L2-001 紧急救援 (25 分)(dijkstra综合应用)
L2-001 紧急救援 (25 分)(dijkstra综合应用)
2022-04-21 11:22:00 【pace_the】
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出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
思路:很模板的一道题,综合考察dijkstra。 需要找最短路径长度,最短路径个数,路径经过了哪些点,以及经过点的某些附加值的相加。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,c1,c2;
int f[580]; //用来记录源点到个点最短路的路径经过了哪些点
int num[591];
int sum[591]; //记录源点到各点最短路径中经过点附加值的和
int e[591][592];
int book[590];
int dis[591];
int cnt[505];
void hs(int c2,int c1){
if(c2==c1){
cout<<c1;
return ;
}else{
hs(f[c2],c1);
cout<<" "<<c2;
return ;
}
}
void dijkstra(){
cnt[c1]=1; //用源点
memset(dis,0x3f3f3f3f,sizeof(dis));
sum[c1]=num[c1]; //用源点
dis[c1]=0;
int i,j;
for(i=0;i<n;i++){ //n个,从源点开始
int now=-1;
int tmp=0x3f3f3f3f;
for(j=0;j<n;j++){
if(book[j]==0&&(now==-1||dis[j]<tmp)){ //now==-1的话也就可以处理不连通图
now=j;
tmp=dis[j];
}
}
book[now]=1;
for(j=0;j<n;j++){
if(dis[j]>dis[now]+e[now][j]){
dis[j]=dis[now]+e[now][j];
f[j]=now;
sum[j]=sum[now]+num[j];
cnt[j]=cnt[now];
}else if(dis[j]==dis[now]+e[now][j]){
if(sum[j]<sum[now]+num[j]){
f[j]=now;
sum[j]=sum[now]+num[j];
}
cnt[j]=cnt[j]+cnt[now]; //路径长度相同的话则最短路径数量相加
}
}
}
return ;
}
int main (){
cin>>n>>m>>c1>>c2;
int i,j;
for(i=0;i<n;i++){
cin>>num[i];
}
memset(e,0x3f3f3f3f,sizeof(e));//注意,这里把e[i][i]即自己到自己的距离定义为inf
for(i=0;i<m;i++){
int u,v,w;
cin>>u>>v>>w;
e[u][v]=min(e[u][v],w);
e[v][u]=min(e[v][u],w);
}
dijkstra();
cout<<cnt[c2]<<" "<<sum[c2]<<endl;
hs(c2,c1);
return 0;
}
版权声明
本文为[pace_the]所创,转载请带上原文链接,感谢
https://blog.csdn.net/ale_upcer/article/details/124183793
边栏推荐
猜你喜欢
随机推荐
【leetcode】647.回文子串
[high quality original] share some unknown and super easy-to-use API functions in sklearn module
Matlab GUI --- animation demonstration of singleselectionlistbox
使用 RSA 进行加解密
犀牛软件插件-rhino插件-visual studio-创建你的第一个插件
Redis database
MQ相關流程及各項內容
MQ related processes and contents
Encryption and decryption using RSA
Introduction to Alibaba's super large-scale Flink cluster operation and maintenance system
【openEuler】Failed to download metadata for repo ‘EPOL‘: Cannot d
NCURSES 安装包,以及pkg-config信息
Xftp文件名称显示乱码解决方法
【leetcode】647. Palindrome substring
ES6新特性(8)之Decorator修饰器/二进制数组
产品分享:Qt+OSG教育学科工具之地理三维星球
现在有没有可以真正称得上是元宇宙的应用?
左程云 - 大厂刷题班 - 绳子覆盖最多的点
你的思维会改变你的行为,你的行为会改变你的境遇
MATLAB---进度条动画演示
![[非线性控制理论]1_Lyapunov直接方法](/img/ad/68bceb288d40ae98b60dbb83e0b91d.png)








