题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680
#include <stdio.h>
#include <string.h>
#define MAXN 1001
#define INF 0x3f3f3f3f
int mp[MAXN][MAXN],n;
int dist[MAXN],visited[MAXN];
void Dijkstra(int s)
{
int min,u,i,j;
for(i=0;i<=n;++i)
{
dist[i]=mp[s][i];
visited[i]=0;
}
dist[s]=0;
visited[s]=1;
for(i=0;i<=n;++i)
{
min=INF;
for(j=0;j<=n;++j)
{
if(!visited[j]&&dist[j]<min)
{
min=dist[j];
u=j;
}
}
if(min==INF)
break;
visited[u]=1;
for(j=0;j<=n;++j)
{
if(!visited[j]&&dist[j]>(dist[u]+mp[u][j]))
dist[j]=dist[u]+mp[u][j];
}
}
}
int main()
{
int m,s,w,i,x,y,t;
while(scanf("%d %d %d",&n,&m,&s)!=EOF)
{
memset(mp,INF,sizeof(mp));
for(i=1;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&t);
if(t<mp[x][y])
mp[x][y]=t;
}
scanf("%d",&w);
while(w--)
{//添加超级源点,变单源点最短路径
scanf("%d",&x);
mp[0][x]=0;
}
Dijkstra(0);
if(dist[s]==INF)
printf("-1\n");
else
printf("%d\n",dist[s]);
}
return 0;
}