这个题真是醉了,优化的folyd超时,使用一个新的想法,如果有多个出发点对应一个终点,可以逆过来建图,注意图初始化就好。
<span style="font-size:14px;">#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int map[1010][1010],dis[1010],vis[1010];
int m,n,e,s[1010];
void dijkstra()
{
int i,j,mi,mark;
memset(vis,0,sizeof(vis));
for(i=1;i<=m;i++)
dis[i]=map[e][i];
vis[e]=1;
dis[e]=0;
for(i=1;i<m;i++)
{
mi=INF;
for(j=1;j<=m;j++)
{
if(mi>dis[j]&&!vis[j])
{
mi=dis[j];
mark=j;
}
}
vis[mark]=1;
for(j=1;j<=m;j++)
{
if(dis[j]>dis[mark]+map[mark][j])
dis[j]=dis[mark]+map[mark][j];
}
}
}
int main()
{
int i,j,w,a,b,c;
while(scanf("%d%d%d",&m,&n,&e)!=EOF)
{
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=INF;
}
}
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[b][a]>c)
map[b][a]=c;
}
dijkstra();
scanf("%d",&w);
int best=INF;
for(i=0;i<w;i++)
{
scanf("%d",&a);
best=best>dis[a]?dis[a]:best;
}
if(best==INF)
printf("-1\n");
else
printf("%d\n",best);
}
return 0;
}</span>