点击打开链接
# include<stdio.h>
# include<string.h>
int a[1005][1005],b[105],c[100005],flag[1005],dis[1005];
void Dijkstra(int m)
{
int i,j,k,min,p;
for(i=0;i<m;i++)
{
min=1000000;
for(j=1;j<=m;j++)
if(min>dis[j]&&flag[j]==0)
{
min=dis[j];
// printf("%d ",dis[j]);
p=j;
// printf("%d \n",p);
}
flag[p]=1;
for(k=1;k<=m;k++)
if(a[p][k]+min<dis[k]&&flag[k]==0)
{
dis[k]=a[p][k]+min;
//printf("%d\n",dis[k]);
}
}
}
int main()
{
int T,n,m,p,q;
scanf("%d",&T);
while(T--)
{
int i,j,x,y,t,s;
memset(flag,0,sizeof(flag));
memset(dis,0,sizeof(dis));
scanf("%d%d%d%d",&n,&m,&p,&q);
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
a[i][j]=10000000;
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
for(i=0;i<p;i++)
{
scanf("%d%d%d",&x,&y,&t);
a[x][y]=t;
a[y][x]=t;
}
for(i=1;i<=m;i++)
dis[i]=a[q][i];
/* for(i=1;i<=m;i++)
printf("%d ",dis[i]);*/
flag[q]=1;
Dijkstra(m);
s=100000000;
for(i=1;i<=n;i++)
{
if(s>dis[b[i]])
s=dis[b[i]];
//printf("%d\n",dis[i]);
}
printf("%d\n",s);
}
return 0;
}