5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MX 1000000
using namespace std;
int t;
int m[1005][1005],D[1000],S[1000];
int p[1005],num[10005];
int dstl()
{
memset(p,0,sizeof(p));
for(int i=1;i<=t;i++)num[i]=MX;
for(int i=1;i<=t;i++)
{
num[i]=m[0][i];
}
for(int i=1;i<=t;i++)
{
int k=0,mi=MX;
for(int j=1;j<=t;j++)
{
if(!p[j]&&num[j]<mi)
{
mi=num[j];
k=j;
}
}
p[k]=1;
if(mi==MX)return MX;
for(int j=1;j<=t;j++)
{
if(!p[j]&&num[j]>num[k]+m[k][j])
num[j]=num[k]+m[k][j];
}
}
}
int main()
{
int s,d,sb,ch;
int a,b,time;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(int i=0;i<=t;i++)
for(int j=0;j<=t;j++)
m[i][j]=MX;
for(int i=1;i<=s;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(time<m[a][b])
m[a][b]=time;
}
scanf("%d",&sb);
for(int i=0;i<sb;i++)
{
scanf("%d",&ch);
m[0][ch]=0;
}
dstl();
if(num[d]==MX)
printf("-1\n");
else
printf("%d\n",num[d]);
}
return 0;
}
Choose the best route,布布扣,bubuko.com
原文:http://blog.csdn.net/zhangweiacm/article/details/38558333