做视频图片博客网站,如何撤销网站上信息吗,网站建设公司西安,百度官方网页作为一个城市的应急救援队伍的负责人#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
代码
#include cstdio
#include iostream
#include algorithm
#include cstring
#include queueusing namespace std;typedef pairint,int PII;
const int N 510;int g[N][N];//图
int n,m,s,d;
int dist[N],st[N];//一般所需
int p[N],cnt[N],sum[N],pre[N];//额外所需void dijkstra()
{memset(dist,0x3f,sizeof dist);//memset(pre,-1,sizeof pre);dist[s] 0;pre[s] -1;cnt[s] 1;sum[s] p[s];priority_queuePII,vectorPII,greaterPII heap;heap.push({0,s});while(heap.size()){int t heap.top().second;heap.pop();if(st[t]) continue;st[t] 1;for(int i 0;i n;i){if(st[i]) continue;if(dist[i] dist[t] g[t][i])//第一条被确定的最短路{dist[i] dist[t] g[t][i];heap.push({dist[i],i});cnt[i] cnt[t];sum[i] p[i] sum[t];pre[i] t;}else if(dist[i] dist[t] g[t][i])//其他的最短路{cnt[i] cnt[t];if(sum[i] sum[t] p[i]){sum[i] sum[t] p[i];pre[i] t;}}}}}void print(int id)
{if(pre[id] ! -1) print(pre[id]);if(pre[id] ! -1) cout ;cout id;
}
int main()
{memset(g,0x3f,sizeof g);cin n m s d;for(int i 0; i n;i) cin p[i];for(int i 0;i m;i){int a,b,c;cin a b c;g[a][b] g[b][a] min(g[a][b],c);}dijkstra();cout cnt[d] sum[d] endl;print(d);//路径return 0;
}
结果