PAT GPLT L2-001.緊急救援
阿新 • • 發佈:2019-01-24
#include<bits/stdc++.h>
using namespace std;
#define N 505
#define inf 0x3f3f3f3f
int mp[N][N],w[N],d[N],vs[N],cnt[N],sum[N],p[N];
//邊,各城市救援隊數,距離,是否到過,方案數,救援隊總數,前驅城市序號
int main()
{
int n,m,s,t,i,j,x,y,z,mn,id;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(i=0;i<n;i++) scanf ("%d",&w[i]),d[i]=inf;
for(i=0;i<n;i++)for(j=0;j<n;j++) mp[i][j]=(i==j?0:inf);
while(m--) scanf("%d%d%d",&x,&y,&z),mp[x][y]=mp[y][x]=min(mp[x][y],z);
d[s]=0;
cnt[s]=1;
sum[s]=w[s];
for(i=0;i<n;i++){
mn=inf;
for(j=0;j<n;j++)if(!vs[j]&&d[j]<mn) mn=d[j],id=j;
vs[id]=1 ;
for(j=0;j<n;j++)if(!vs[j]){
if(d[j]==d[id]+mp[id][j]){
cnt[j]+=cnt[id];
if(sum[j]<sum[id]+w[j]) sum[j]=sum[id]+w[j],p[j]=id;
}
else if(d[j]>d[id]+mp[id][j]){
d[j]=d[id]+mp[id][j];
cnt[j]=cnt[id];
sum[j]=sum[id]+w[j];
p[j]=id;
}
}
}
printf ("%d %d\n",cnt[t],sum[t]);
stack<int>S;
while(t!=s) S.push(t),t=p[t];
printf("%d",s);
while(!S.empty()) t=S.top(),S.pop(),printf(" %d",t);
}