L2-001 城市间紧急救援 (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
代码:
思路:在迪杰斯特拉算法中判断是否修改最短路径时判断当同时出现最短距离时,哪条路上救援队的数量更多即可。(测试点2没过,希望有大佬可以给我指出错误)
#include<bits/stdc++.h>
using namespace std;
int dist[501];//用于储存最短距离
int pre[501];//用于存储前一个节点
bool visit[501]={false};//用于判断是否进入最短距离
int num[501]={0};//用于记录到某个节点最短距离的路径数量
int weight[501];//用于储存救援队数量
int w[501]={0};//用于存储出发点到各点可召集救援队的数量
typedef struct enode//建立图
{
int vnum;
int Enum;
int edges[501][501];
}MGraph;
MGraph a;
void Dijkstra(MGraph a,int v);
int main()
{
cin>>a.vnum>>a.Enum;
int v,u;
cin>>v>>u;
int i,j;
for(i=0;i<a.vnum;i++){ //初始化
for(j=0;j<a.vnum;j++){
a.edges[i][j]=99999;
}
}
for(i=0;i<a.vnum;i++){
cin>>weight[i];
}
for(i=0;i<a.Enum;i++){
int p,q,leng;
cin>>p>>q>>leng;
a.edges[p][q]=leng;
a.edges[q][p]=leng;
}
Dijkstra(a,v);
int min=99999;
for(i=0;i<a.vnum;i++){
if(dist[i]<min&&i!=v){
min=dist[i];
}
}
cout<<num[u]<<" "<<w[u]<<endl;
stack<int> list;
while(pre[u]!=-1){
list.push(u);
u=pre[u];
}
cout<<v;
while(!list.empty()){
cout<<" "<<list.top();
list.pop();
}
return 0;
}
void Dijkstra(MGraph a,int v)
{
fill(dist,dist+501,99999); //将整个dist数组赋值为最大
int i;
num[v]=1;
for(i=0;i<501;i++){
pre[i]=-1;
}
dist[v]=0;
w[v]=weight[v];
for(i=0;i<a.vnum;i++){
int u=-1;
int min=100000;
for(int j=0;j<a.vnum;j++){
if(visit[j]==false&&dist[j]<min){
u=j;
min=dist[j];
}
}
if(u==-1){return;}
visit[u]=true;
for(int j=0;j<a.vnum;j++){
if(visit[j]==false&&a.edges[u][j]!=99999){
if(dist[u]+a.edges[u][j]<dist[j]){
dist[j]=dist[u]+a.edges[u][j];
num[j]=num[u];
w[j]=w[u]+weight[j];
pre[j]=u;
}
else if(dist[u]+a.edges[u][j]==dist[j]&&w[u]+weight[j]>w[j]){
num[j]+=num[u];
w[j]=w[u]+weight[j];
pre[j]=u;
}
}
}
}
}