7-2 城市间紧急救援 (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

主要思想是:裸的Dijkstra,问题是如何计算最短路径条数,其实遵循这样两条原则:

  1. 如果A到B只有一条路可以走,那么到B的路条数就是到A的条数
  2. 如果不是一条路,就把所有的路加起来。
#include <bits/stdc++.h>
using namespace std;
int Map[501][501];   //记录图的边信息
int peo[501];   //截止走到此处积累的人数 
int Count[501];  //走到此处的方法数
int vis[501];   //此点是否已经走过
int Path[501];   //记录路径
int dist[501];
int ph[501];   //people here:此点的人数 
int n,s,d;
void path(int d);
int main()
{int m;cin>>n>>m>>s>>d;for (int i=0;i<n;i++)//初始化 {Path[i]=-1;dist[i]=1000000;cin>>ph[i];for (int j=0;j<n;j++){Map[i][j]=1000000;}}dist[s]=0;  //起点到起点的距离是0 Count[s]=1; //起点到起点一种方式 vis[s]=1;   //将起点放入集合 peo[s]=ph[s];  //走到起点的人数就是起点的人数 int c1,c2,len;  //输入使用 for (int i=0;i<m;i++)  //输入边的信息 {cin>>c1>>c2>>len;Map[c1][c2]=len;Map[c2][c1]=len;}for (int i=0;i<n;i++){if (Map[s][i]!=1000000){dist[i]=Map[s][i];}} //初始化完成 int min=s,minf;   //min存放最小值下标,minf存放最小值 for (int i=1;i<n;i++)   //只需要循环n-1次,因为每次会挑选一个最小值,起点已经进入集合 {if (i==1){minf=dist[s];}else{minf=1000000;}for (int j=0;j<n;j++){if (!vis[j]&&dist[j]<minf)  //挑选最小值 {min=j;minf=dist[j];}}vis[min]=1;   //最小值放入集合for (int j=0;j<n;j++){if (vis[j]==0&&Map[min][j]!=1000000&&dist[min]+Map[min][j]<dist[j])//需要更新 {dist[j]=dist[min]+Map[min][j];Path[j]=min;Count[j]=Count[min];  //直线走过来,这点到达的方式和前驱相同peo[j]=peo[min]+ph[j];  //人手积累 }else if (vis[j]==0&&Map[min][j]!=1000000&&dist[min]+Map[min][j]==dist[j])//相等,需要看人手{Count[j]+=Count[min];  //不管怎样,来着的方法要加1if (peo[min]+ph[j]>peo[j])//这条道路摇人更多 {peo[j]=peo[min]+ph[j];Path[j]=min;  //换线 }}}}printf("%d %d\n",Count[d],peo[d]);path(d);printf("%d",d);return 0;
}void path(int d) 
{if(Path[d] != -1) {path(Path[d]);printf("%d ", Path[d]);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win32 多文档多视图

#include<Windows.h> #include<tchar.h> #include"resource.h" //全局变量 LPSTR g_MainFrame "主框架"; LPSTR g_ClientFrame "客户区框架"; LPSTR g_ChildFrame[] { "子框架1","子框架2" }; //主窗口和子…

【前沿技术】严重事故!实习生删除字节跳动所有轻量级机器学习模型

来源&#xff1a;智能研究院昨晚脉脉上有网友爆料&#xff0c;字节跳动一位实习生删除了公司所有轻量级别的机器学习模型&#xff01;什么是lite模型&#xff1f;该楼主表示&#xff0c;lite模型就是公司内几乎所有GB大小以下的机器学习模型&#xff0c;且全部被删除了&#xf…

7-1 是否同一棵二叉搜索树 (30分)

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而&#xff0c;一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树&#xff0c;都得到一样的结果。于是对于输入的各种插入序列&#xff0c;你需要判断它们…

Linux基础命令---文本显示od

od 将指定文件的内容以八进制、十进制、十六进制等编码方式显示。此命令的适用范围&#xff1a;RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。 1、语法 od [选项] file od [-abcdfilosx]... [FILE] [[]OFFSET[.][b]] od --traditional [OPTION]... [FILE] [[]OF…

MFC TabCtrl用法

基于对话框的MFC程序, 在主对话框中添加TabCtrl控件,CTabCtrl 类型的变量m_tabctrl; 插入3对话框&#xff0c;并设置属性styleChild,BorderNone,创建三个对话框类CDialog1&#xff0c;CDialog2&#xff0c;CDialog3&#xff1b;在主对话框中创建三个对话框类的全局对象 m_dg1,m…

机器人行业研究报告:智能化造就新时代,自动化生产成刚需

来源&#xff1a;东莞证券作者&#xff1a;黄秀瑜核心观点智能转型时代&#xff0c;机器人前景可期。智能化时代到来&#xff0c;工业机器人和服务 机器人逐渐普及。疫情后制造业走出低迷&#xff0c;中国工业机器人月产量创新 高。全球老龄化问题日益严重&#xff0c;中国作为…

7-2 是否完全二叉搜索树 (30分)

将一系列给定数字顺序插入一个初始为空的二叉搜索树&#xff08;定义为左子树键值大&#xff0c;右子树键值小&#xff09;&#xff0c;你需要判断最后的树是否一棵完全二叉树&#xff0c;并且给出其层序遍历的结果。 输入格式&#xff1a; 输入第一行给出一个不超过20的正整数…

bzoj 1596 电话网络

Description Farmer John决定为他的所有奶牛都配备手机&#xff0c;以此鼓励她们互相交流。不过&#xff0c;为此FJ必须在奶牛们居住的N(1 < N < 10,000)块草地中选一些建上无线电通讯塔&#xff0c;来保证任意两块草地间都存在手机信号。所有的N块草地按1..N 顺次编号。…

读取BMP格式数据

#pragma once #include<afx.h> class DigitalImage { private: //指针数据类型&#xff0c;需要动态分配数据大小&#xff0c;并初始化数据 char m_FileName[100]; //文件头 LPBITMAPFILEHEADER m_lpBitmapFileHender; //除位图文件头的所有数据 LPBYTE…

指甲盖大小塞了500亿晶体管!领先台积电,IBM打造世界首款2纳米芯片!能耗仅为7纳米的1/4!...

文章来源&#xff1a;EETOP我们知道在2014年IBM已将其Microelectronics部门出售给GlobalFoundries时&#xff0c;IBM就已经宣告退出芯片代工业务。但这几年来&#xff0c;尽管IBM退出了代工业务&#xff0c;不过好像IBM在半导体先进工艺研发上一直没有放弃&#xff0c;时不时会…

读取bmp格式数据--实践思考

实践代码 头文件 #pragma once #include <afx.h> class DigitalImage { private://指针数据类型&#xff0c;需要动态分配数据大小&#xff0c;并初始化数据//文件头LPBITMAPFILEHEADER m_lpBitmapFileHender;//除位图文件头的所有数据LPBYTE m_lpNotFileHenderData;//…

人工智能浪潮褪去,冲刺IPO成AI企业生存关键?

来源&#xff1a; 大作此前&#xff0c;AI四小龙持续亏损、登科受阻&#xff0c;投影出“AI估值泡沫&#xff0c;风口浪潮已褪”的现实。反观AI四小龙同期的独角兽格灵深瞳&#xff0c;6月22日科创板IPO受理&#xff0c;拟募资10亿元用于AI算法平台升级、创新应用研发等项目。前…

【开源】iTest教学辅助系统源代码

iTest教学辅助系统 2020.10.16第一次更新 重置了下载链接 2020.12.21第二次更新 重置了下载链接 2021.05.07第三次更新 重置了下载链接 1.关于iTest教学辅助系统 i实验辅助教学平台是基于局域网开发&#xff0c;力求为教师和学生用户提供实验课堂辅助教学环境的计算机系统&…

KnockoutJS-与服务端交互

几乎所有Web应用程序都要和服务器端交换数据&#xff0c;交换数据时最方便的就是使用JSON格式。Knockout可以实现很复杂的客户端交互&#xff0c;对于前后端交互使用的技术最为基本且常用的是Ajax&#xff0c;本次利用Ajax和ko的双向绑定完成一些简单的功能&#xff0c;可以快速…

神经网络无法区分异同,而且这个缺陷是本质性的

来源&#xff1a;混沌巡洋舰1969年《芝麻街》的第一集中有一个片段叫做“这些东西中的一个与众不同”。观众们被要求考虑一张展示三个2和一个 w 的海报&#xff0c;然后一边跟着游戏的同名广告歌唱&#xff0c;一边决定哪个符号不属于这个标志。《芝麻街》中的很多集重复了这个…

matlab计算级数和

级数(series)是指将数列的项依次用加号连接起来的函数。典型的级数有正项级数、交错级数、幂级数、傅里叶级数等。 —百度百科 matlab提供了直接计算级数的两个方法&#xff0c;symsum的两种形式&#xff08;做题刚开始以为是重载&#xff0c;直接导致了上一篇帖子的产生 &…

北国风光

转载于:https://www.cnblogs.com/ssyfj/p/10214328.html