题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2674
#include <stdio.h>
#define size 1011
#define INF 0x7f7f7f7f
int map[size][size];
int m[size],mark[size],dis[size];
int count,n;
void Dijkstra()
{
int i,j,k,t;
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++)
{
t=INF;
for(j=1;j<=n;j++)
{
if(mark[m[j]]==0)
{
if(dis[m[j]]<t)
{
t=dis[m[j]];
k=m[j];
}
}
}
mark[k]=1;
for(j=1;j<=n;j++)
{
if(map[k][m[j]]!=INF)
dis[m[j]]=dis[k]+map[k][m[j]]<dis[m[j]]?dis[k]+map[k][m[j]]:dis[m[j]];
}
}
}
int main()
{
int T,S,D,i,j,k,t;
while(scanf("%d%d%d",&T,&S,&D)!=EOF)
{
n=0;
memset(mark,0,sizeof(mark));
memset(map,INF,sizeof(map));
memset(dis,INF,sizeof(dis));
for(i=1;i<=T;i++)
{
scanf("%d%d%d",&j,&k,&t);
if(mark[j]==0)mark[j]=1,m[++n]=j;
if(mark[k]==0)mark[k]=1,m[++n]=k;
map[j][k]=map[k][j]=t<map[j][k]?t:map[j][k];
}
for(i=1;i<=S;i++)
{
scanf("%d",&t);
dis[t]=0;
}
Dijkstra();
k=INF;
for(i=1;i<=D;i++)
{
scanf("%d",&t);
if(k>dis[t])
{
k=dis[t];
}
}
printf("%d\n",k);
}
return 0;
}