http://acm.hdu.edu.cn/showproblem.php?pid=2680
注意:单向边,逆向保存
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int NM=1005;
const int MAX=0xfffff;
int a[NM][NM],p[NM],n,m;
bool flag[NM];
void Dis(int s)
{
int i,j,MIN,k;
memset(flag,0,sizeof(flag));
for(i=1;i<=n;i++)
p[i]=a[s][i];
p[s]=0,flag[s]=1;
for(i=1;i<n;i++)
{
MIN=MAX;
for(j=1;j<=n;j++)
{
if(!flag[j]&&MIN>p[j])
{
k=j;
MIN=p[j];
}
}
if(MIN==MAX) break;
flag[k]=1;
for(j=1;j<=n;j++)
{
if(!flag[j]&&p[j]>p[k]+a[k][j])
p[j]=p[k]+a[k][j];
}
}
}
int main()
{
int i,j,s,w,ans,mmin,A,B,C;
while(scanf("%d%d%d",&n,&m,&s)!=EOF)
{
for(i=1;i<=n;i++)
{
p[i]=MAX;
for(j=1;j<=n;j++)
a[i][j]=MAX;
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&A,&B,&C);
if(C<a[B][A]) //注意是逆向
a[B][A]=C;
}
Dis(s);
mmin=MAX;
scanf("%d",&w);
for(i=0;i<w;i++)
{
scanf("%d",&ans);
if(p[ans]<mmin) mmin=p[ans];
}
if(mmin==MAX) printf("-1\n");
else printf("%d\n",mmin);
}
return 0;
}