1. 程式人生 > >PAT GPLT L2-001.緊急救援

PAT GPLT L2-001.緊急救援

題目連結

#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); }