简单的一道题,但是还是看了下别人的代码才做出来,水,这个题方法挺多的,但是最开始看到这个题想用folyd,但是会超时,因为是1000,然后想了想dij,然后试了下,发现个大问题,就是dij是对于一个点的所有最短路径,而最开始的出发点又不确定,当把这些出发点输入进去后,我凌乱了,结果还是用了folyd,稍微剪枝,然后遍历寻找符合的结果。
<span style="font-size:14px;">#include <iostream>
#define inf 99999999
using namespace std;
int main()
{
int map[1005][1005];
int t,s,d,i,j,k;
int a,b,c;
int fam[1005],want[1005];
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=1001;i++)
{
for(j=1;j<=1001;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
}
}
int n=-99999999;
for(i=1;i<=t;i++)
{
cin>>a>>b>>c;
if(a>n)n=a;
if(b>n)n=b;
if(map[a][b]>c)
{
map[a][b]=map[b][a]=c;
}
}
memset(fam,0,sizeof(fam));
memset(want,0,sizeof(want));
for(i=1;i<=s;i++)
{
cin>>fam[i];
}
for(i=1;i<=d;i++)
{
cin>>want[i];
}
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
if(map[i][k]==inf)
continue;
for(j=1;j<=n;j++)
{
if(map[i][j]>map[i][k]+map[k][j])
{
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
int min_=inf;
for(i=1;i<=s;i++)
{
for(j=1;j<=d;j++)
{
if(map[fam[i]][want[j]]<min_)
{
min_=map[fam[i]][want[j]];
}
}
}
cout<<min_<<endl;
}
}</span>