这道题要注意重边问题= =
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int maxn=1000; int G[2*maxn][2*maxn]; int f[2*maxn],d[2*maxn]; #define inf 100000000 int dijk() { int ans=0; memset(f,0,sizeof(f)); for(int i=0;i<=1000;i++) { d[i]=inf; } d[0]=0; for(int i=0;i<=1000;i++) { int x,min=inf; for(int v=0;v<=1000;v++) { if(!f[v]&&d[v]<min) { min=d[v]; x=v; } } f[x]=1; for(int u=0;u<=1000;u++) { if(d[x]+G[x][u]<d[u]) d[u]=d[x]+G[x][u]; } } return 0; } int main() { int T,s,D,a,b,h; while(scanf("%d %d %d",&T,&s,&D)!=EOF) { for(int i=0;i<=1000;i++) { for(int j=0;j<=1000;j++) G[i][j]=inf; } for(int i=1;i<=T;i++) { scanf("%d %d %d",&a,&b,&h); if(h<G[a][b]) { G[a][b]=h; G[b][a]=h;//有多个权值,选择最小的权值 } } int x; for(int i=0;i<s;i++) { scanf("%d",&x); G[0][x]=0; G[x][0]=0; } int ans=inf; dijk(); int y; for(int i=0;i<D;i++) { scanf("%d",&y); if(d[y]<ans) ans=d[y]; } printf("%d\n",ans); } return 0; }