这个题只要把小孩的家看做0节点,把和小孩家相邻的城市和他家连起来且边权值为0即可(QAQ)
这里用spfa,好久不写了有点生疏
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int N=1000+5;
const int INF=0x3f3f3f3f;
int m,s,t;
int u,v,val;
int dis[N],vis[N];
struct P
{
int to,cost;
};
vector<P> G[N];
void spfa(int st)
{
memset(dis,INF,sizeof(dis));
dis[st]=0;
memset(vis,0,sizeof(vis));
queue<int> qu;
qu.push(st);
while(!qu.empty())
{
int U=qu.front();
qu.pop();
vis[U]=0;
for(int i=0; i<G[U].size(); i++)
{
P V=G[U][i];
if(dis[U]+V.cost<=dis[V.to])
{
dis[V.to]=dis[U]+V.cost;
if(!vis[V.to])
{
qu.push(V.to);
vis[V.to]=1;
}
}
}
}
}
int main()
{
while(scanf("%d%d%d",&m,&s,&t)!=EOF)
{
for(int i=0;i<=1000;i++) G[i].clear();//容易忘记
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&u,&v,&val);
G[u].push_back(P{v,val});
G[v].push_back(P{u,val});
}
for(int i=1; i<=s; i++)
{
scanf("%d",&u);
G[0].push_back(P{u,0});
G[u].push_back(P{0,u});
}
spfa(0);
int ans=INF;
for(int i=1; i<=t; i++)
{
scanf("%d",&u);
ans=min(ans,dis[u]);
}
printf("%d\n",ans);
}
return 0;
}