这道题不能用堆优化dijkstra,会超时,应该用朴素版的dijkstra,并且要注意可能存在重边的情况,输入的时候要处理一下
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<queue>
#include<vector>
using namespace std;
const int N=1001;
//记起点为0
int d[N],vis[N];
int w[N][N];
int T,S,D;
void dijkstra(int x){
memset(d,0x3f,sizeof d);
d[x]=0;
for(int i=0;i<N;i++){
int minn=-1;
for(int j=0;j<N;j++){
if(!vis[j]&&(minn==-1||d[j]<d[minn])) minn=j;
}
if(minn==-1) break; //图中所有节点已处理完毕
vis[minn]=1;
for(int j=0;j<N;j++){
if(d[j]>d[minn]+w[minn][j])
d[j]=d[minn]+w[minn][j];
}
}
}
int main(){
while(~scanf("%d%d%d",&T,&S,&D)){
memset(w,0x3f,sizeof w);
memset(vis,0,sizeof vis);
while(T--){
int a,b,time;
scanf("%d%d%d",&a,&b,&time);
w[a][b]=w[b][a]=min(w[a][b],time); //处理重边
}
while(S--){
int x;
scanf("%d",&x);
w[0][x]=w[x][0]=0;
}
dijkstra(0);
int maxx=0x3f3f3f3f;
while(D--){
int x;
scanf("%d",&x);
if(maxx>d[x])
maxx=d[x];
}
printf("%d\n",maxx);
}
}