#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int N=505;
int n,m,s,d;
int ren[N];
int ma[N][N];
int cnt[N];
int vis[N];
int pre[N],dis[N],nn[N];
void dij()
{
for(int i=0;i<n;i++)
{
dis[i]=ma[s][i];
vis[i]=0;
pre[i]=-1;
if(dis[i]!=INF)
cnt[i]=1,nn[i]=ren[i];
else
cnt[i]=0,nn[i]=0;
}
dis[s]=0;
vis[s]=1;
nn[s]=ren[s];
for(int i=0;i<n;i++)
{
int mitt=INF;
int k=-1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]<mitt)
{
mitt=dis[k=j];
}
}
if(k==-1||k==d)
return;
vis[k]=1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]>dis[k]+ma[k][j])
{
dis[j]=dis[k]+ma[k][j];
nn[j]=nn[k]+ren[j];
pre[j]=k;
cnt[j]=cnt[k];
}
else if(!vis[j]&&dis[j]==dis[k]+ma[k][j])
{
cnt[j]+=cnt[k];
if(nn[j]<nn[k]+ren[j])
nn[j]=nn[k]+ren[j],pre[j]=k;
}
}
}
}
int main()
{
int ans[505];
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=0;i<n;i++)
{
scanf("%d",&ren[i]);
vis[i]=0;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ma[i][j]=INF;
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(ma[a][b]>c) ma[a][b]=ma[b][a]=c;
}
vis[s]=1;
dij();
printf("%d %d\n",cnt[d],nn[d]+ren[s]);
ans[0]=d;
int flag=1;
for(int i=pre[d];i!=-1;i=pre[i])
ans[flag++]=i;
printf("%d",s);
for(int i=flag-1;i>=0;i--)
printf(" %d",ans[i]);
printf("\n");
}
城市间紧急救援-多维最短路
最新推荐文章于 2022-12-29 11:39:34 发布