http://acm.hdu.edu.cn/showproblem.php?pid=2066
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAX 0x3fffffff
const int NM=1005;
int a[NM][NM],mmax;
bool c1[NM],c2[NM];
void Floyd()
{
int i,j,k,mmin;
mmin=MAX;
for(k=1;k<=mmax;++k)
for(i=1;i<=mmax;++i)
if(a[i][k]!=MAX)
{
for(j=1;j<=mmax;++j)
{
int t=a[i][k]+a[k][j];
a[i][j]=a[i][j]<t?a[i][j]:t;
if(c1[i]&&c2[j]&&mmin>a[i][j])
mmin=a[i][j];
}
}
printf("%d\n",mmin);
}
int main()
{
int i,j,s,t,d,A,B,C;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<NM;i++) //没想到问题在这里!!!
for(j=1;j<NM;j++)
a[i][j]=MAX;
mmax=0;
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&A,&B,&C);
mmax=mmax>A?mmax:A;
mmax=mmax>B?mmax:B;
a[A][B]=a[B][A]=a[A][B]<C?a[A][B]:C;
}
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
for(i=0;i<s;i++) //源点
{
scanf("%d",&t);
c1[t]=1;
}
for(i=0;i<d;i++) //目标点
{
scanf("%d",&t);
c2[t]=1;
}
Floyd();
}
return 0;
}