囧~~~
wa了一次找不到原因,
最后才知道,这道题是单向边~~~~
代码如下:
#include<stdio.h>
#include<string.h>
#include<limits.h>
const int mx=INT_MAX-1e8;
const int N=1002;
int mp[N][N],vis[N],divs[N];
int n,m,s;
void init()
{
memset(vis,0,sizeof(vis));
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
{
if(i==j)
mp[i][j]=0;
else
mp[i][j]=mx;
}
}
int dij()
{
for(int i=0; i<=n; i++)
divs[i]=mp[0][i];
divs[0]=0;
vis[0]=1;
for(int i=1; i<=n; i++)
{
int min=mx;
int t=-1;
for(int j=0; j<=n; j++)
if(!vis[j]&&divs[j]<min)
min=divs[j],t=j;
if(t==-1)
break;
vis[t]=1;
for(int j=0; j<=n; j++)
if(!vis[j]&&divs[j]>divs[t]+mp[t][j])
divs[j]=divs[t]+mp[t][j];
}
return divs[s];
}
int main()
{
//freopen("a.txt","r",stdin);
while(~scanf("%d%d%d",&n,&m,&s))
{
init();
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(c<mp[a][b])
mp[a][b]=c;
}
int k;
scanf("%d",&k);
while(k--)
{
int a;
scanf("%d",&a);
mp[0][a]=mp[a][0]=1;
}
int ans=dij();
printf("%d\n",ans<mx?ans-1:-1);
}
}