将小草的家当做0点,相邻城市到小草家的距离设为0,然后一次dijkstra就可以啦
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int mp[1005][1005],book[1005],dis[1005]; int t,s,d,n,mn,u; int inf=99999; void dist(int x) { book[x]=1; for(int i=0;i<=n;i++) { mn=inf; for(int j=0;j<=n;j++) { if(book[j]==0 && dis[j]<mn) { u=j; mn=dis[j]; } } book[u]=1; for(int k=0;k<=n;k++) { if(mp[u][k]<inf) { dis[k]=min(dis[k],dis[u] + mp[u][k]); } } } } int main() { int a,b,c,way; while(cin>>t>>s>>d) { memset(book,0,sizeof(book)); n=0; way=inf; for(int i=0;i<=1000;i++) { for(int j=0;j<=1000;j++) { if(i==j) mp[i][j]=0; else mp[i][j]=inf; } } for(int i=0;i<t;i++) { cin>>a>>b>>c; mp[a][b]=min(mp[a][b],c); mp[b][a]=mp[a][b]; n=max(n,a); n=max(n,b); } for(int i=0;i<s;i++) { cin>>a; mp[a][0]=mp[0][a]=0; } for(int i=0;i<=n;i++) { dis[i]=mp[0][i]; } dist(0); for(int i=0;i<d;i++) { cin>>a; way=min(way,dis[a]); } cout<<way<<endl; } return 0; }