个人网站制作网站建设公司网站建设公司
个人网站制作,网站建设公司网站建设公司,英德市建设及城乡管理局网站,微信网站上传图片作为一个城市的应急救援队伍的负责人#xff0c;你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候#xff0c;你的任务是带领你的…作为一个城市的应急救援队伍的负责人你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候你的任务是带领你的救援队尽快赶往事发地同时一路上召集尽可能多的救援队。
输入格式: 输入第一行给出4个正整数N、M、S、D其中N2≤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问题是如何计算最短路径条数其实遵循这样两条原则
如果A到B只有一条路可以走那么到B的路条数就是到A的条数如果不是一条路就把所有的路加起来。
#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;cinnmsd;for (int i0;in;i)//初始化 {Path[i]-1;dist[i]1000000;cinph[i];for (int j0;jn;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 i0;im;i) //输入边的信息 {cinc1c2len;Map[c1][c2]len;Map[c2][c1]len;}for (int i0;in;i){if (Map[s][i]!1000000){dist[i]Map[s][i];}} //初始化完成 int mins,minf; //min存放最小值下标minf存放最小值 for (int i1;in;i) //只需要循环n-1次因为每次会挑选一个最小值起点已经进入集合 {if (i1){minfdist[s];}else{minf1000000;}for (int j0;jn;j){if (!vis[j]dist[j]minf) //挑选最小值 {minj;minfdist[j];}}vis[min]1; //最小值放入集合for (int j0;jn;j){if (vis[j]0Map[min][j]!1000000dist[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]0Map[min][j]!1000000dist[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/pingmian/88032.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!