基础实验6-2.5 城市间紧急救援 (25 分)
多重判断的dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int map[550][550],vis[550],dis[550],path[550],cnt[550],sum[550],aa[550];
int n,m,s,d;
void dfs(int x)
{
if(x==s){
cout<<x;
return ;
}
dfs(path[x]);
cout<<" "<<x;
}
void dijkstra()
{
memset(dis,inf,sizeof(dis));
dis[s]=0;
cnt[s]=1;
for(int i=0;i<n;++i)
{
int t=-1;
for(int j=0;j<n;++j)
if(!vis[j]&&(t==-1||dis[j]<dis[t]))
t=j;
vis[t]=1;
for(int j=0;j<n;++j)
{
if(!vis[j]&&dis[j]>dis[t]+map[t][j]){
dis[j]=dis[t]+map[t][j];
sum[j]=sum[t]+aa[j];
cnt[j]=cnt[t];
path[j]=t;
}
else if(!vis[j]&&dis[j]==dis[t]+map[t][j]){
cnt[j]+=cnt[t];
if(sum[j]<sum[t]+aa[j]){
sum[j]=sum[t]+aa[j];
path[j]=t;
}
}
}
}
}
int main()
{
memset(map,inf,sizeof(map));
cin>>n>>m>>s>>d;
for(int i=0;i<n;++i)
{
map[i][i]=0;
cin>>aa[i];
sum[i]=aa[i];
}
while(m--)
{
int x,y,z;
cin>>x>>y>>z;
map[x][y]=map[y][x]=z;
}
dijkstra();
cout<<cnt[d]<<" "<<sum[d]<<endl;
dfs(d);
}