题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2680
这个题第一次正规正矩的按题意写结果WA了(幸好WA了。。),然后在思考特殊数据的时候突然想到这题有个小技巧,就是可以把起点当终点,把终点当起点,然后所有路线顺序全换过来。这样的话每次就只需要求一次最短路即可。如果正规正矩的写的话就算不WA,也有TLE的风险。奇怪的是这样一改居然就AC了。。都不知道那样写为什么会WA。。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>
using namespace std;
int d[1100], vis[1100], mp[1100][1100], maxint=100000000, n;
void dijk(int s)
{
int i, j, min1, pos;
for(i=1;i<=n;i++)
d[i]=mp[s][i];
d[s]=0;
vis[s]=1;
for(i=1;i<n;i++)
{
min1=maxint;
for(j=1;j<=n;j++)
{
if(!vis[j]&&min1>d[j])
{
min1=d[j];
pos=j;
}
}
if(min1==maxint)
break;
vis[pos]=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&d[j]>mp[pos][j]+d[pos])
{
d[j]=mp[pos][j]+d[pos];
}
}
}
}
int main()
{
int i, j, a, b, c, m, s, min1, t, p, x;
while(scanf("%d%d%d",&n,&m,&s)!=EOF)
{
memset(vis,0,sizeof(vis));
min1=maxint;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
mp[i][j]=maxint;
}
}
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(mp[b][a]>c)
mp[b][a]=c;
}
dijk(s);
scanf("%d",&t);
while(t--)
{
scanf("%d",&p);
if(min1>d[p])
min1=d[p];
}
printf("%d\n",min1==maxint?-1:min1);
}
return 0;
}