作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出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 参考博客:https://www.liuchuo.net/archives/2362 #include<bits/stdc++.h> using namespace std; const int inf = 99999999; int n,m,c1,c2;// c1 为起始城市 c2为终点城市 int dis[505],edge[505][505],w[505],num[505],weight[505],pre[505]; // dis数组 边数组 输入的城市救援队数组 记录路径条数的数组 最短路径权值数组 记录过程的数组 int visit[505]; void print(int n) { if(n == c1) { cout << n; return ; } print(pre[n]); cout << " " << n; } int main() { cin >> n >> m >> c1 >> c2; //输入信息 for(int i = 0;i < n;i ++) cin >> weight[i]; fill(edge[0],edge[0] + 505*505,inf); //填充数据 fill(dis,dis + 505,inf); int t1,t2,t3; //城市1、城市2、快速道路的长度 for(int i = 0;i < m;i ++) { cin >> t1 >> t2 >> t3; edge[t1][t2] = t3; edge[t2][t1] = t3; } dis[c1] = 0; //设置起始城市 w[c1] = weight[c1]; num[c1] = 1; for(int i = 0;i < n;i ++) { int k = -1,minn = inf; for(int j = 0;j < n;j ++) { if(!visit[j] && dis[j] < minn) { k = j; minn = dis[j]; } } if(k == -1) break; visit[k] = 1; for(int j = 0;j < n;j ++) { if(!visit[j] && edge[k][j] != inf) { if(dis[j] > edge[k][j] + dis[k]) { dis[j] = edge[k][j] + dis[k]; num[j] = num[k]; w[j] = w[k] + weight[j]; pre[j] = k; } else if(dis[j] == edge[k][j] + dis[k]) { num[j] = num[j] + num[k]; if(w[j] < w[k] + weight[j]) { w[j] = w[k] + weight[j]; pre[j] = k; } } } } } cout << num[c2] << " " << w[c2] << endl; print(c2); return 0; }