只需要加一个起点,到所有原始起点权值为0.然后,就是最短路了。。。
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAX 1000000
int g[1010][1010];
int vis[1010];
int cost[1010];
int main()
{
int n,m,s;
while(scanf("%d %d %d",&n,&m,&s)==3)
{
memset(g,MAX,sizeof(g));
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if(c<g[a][b])
g[a][b]=c;
}
int a;
scanf("%d",&a);
for(int i=0;i<=n;i++)
{
cost[i]=g[0][i];
vis[i]=0;
}
for(int i=0;i<a;i++)
{
int b;
scanf("%d",&b);
cost[b]=0;
}
vis[0]=1;
for(int i=1;i<=n;i++)
{
int k,t=MAX;
for(int j=1;j<=n;j++)
if( !vis[j] && cost[j]<t )
{
t=cost[j];
k=j;
}
vis[k]=1;
for(int j=1;j<=n;j++)
if( !vis[j] && cost[j]>cost[k]+g[k][j] )
cost[j]=cost[k]+g[k][j];
}
if(cost[s]>=MAX) printf("-1\n");
else printf("%d\n",cost[s]);
}
return 0;
}