题目描述 小科非常喜欢旅行,他想去泰国、新加坡、印度尼西亚,想尝尝咖喱、肉骨茶以及印尼九层塔,想晒太阳、放烟花,参加泳池趴。但是假期有限,还有一堆事情要完成,所以他只能选择一个地方去旅行。所以他开始规划他的旅行了,小科计划坐火车去旅行,首先他先想办法到邻近的几个城市(小科到邻近城市的时间忽略不计,假设车是无限多的,想坐车时随时有车,不用等车),然后从城市坐火车去。另外小科想花最短的时间选择一个想去的地方去旅行这样能够省很多的时间。接下来给出城市之间的线路信息,请你帮助策划一下这趟旅行。
输入格式 输入文件名:travel.in
数据包含多组数据,对于每组数据:
第一行,用空格隔开的三个整数m,s,d,m表示城市之间有m趟列车,s表示跟小科家相邻的有s个城市,d表示小科有d个想去的城市
接下来m行,每行描述一个车次信息,是用空格隔开的三个整数u,v,w表示城市u v之间有趟车,车程w小时,车是双向的且u和v之间有可能存在多种车次。
接下来一行,是用空格隔开的s个整数,表示跟小科家相邻的s个城市的编号
接下来一行,是用空格隔开的d个整数,表示小科想去的城市的编号
输出格式 输出文件名:travel.out
对于每组数据,输出一行,一个整数表示小科能够到达一个他想去的城市的最短花费时间。
输入输出样例 输入样例1: 6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
画写样例1: 9
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1010;
ll m,s,d,u,v,w,a,b,ans=0x7fffffff,mx;
ll G[N][N];
bool vis[N][N];
void dfs(ll k){
ll sum=0;
if(k==b){
ans=min(ans,sum);
return ;
}
for(int i=1;i<=mx;i++){
if(G[k][i]!=0&&k!=0&&!vis[k][i]){
sum+=G[k][i];
vis[k][i]=1;
dfs(i);
vis[k][i]=0;
}
else if(G[k][i]==-1&&k==0&&!vis[k][i]){
vis[k][i]=1;
dfs(i);
vis[k][i]=0;
}
}
}
int main(){
//freopen("travel.in","r",stdin);
//freopen("travel.out","w",stdout);
while(cin>>m>>s>>d){
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
ans=0x7fffffff;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
G[u][v]=w;
G[v][u]=w;
mx=max(mx,u);
mx=max(mx,v);
}
for(int i=1;i<=s;i++){
cin>>a;
G[0][a]=-1;
G[a][0]=-1;
}
for(int i=1;i<=d;i++){
cin>>b;
dfs(0);
}
cout<<ans<<endl;
}
return 0;
}