题目描述
Peacefuldoge 想要开面包店,国家有 n 个城市,m 条双向道路。他需要向一些仓库进原料,而他的国家有 k 个城市有仓库。很不幸,根据这个国家的法律,他不能在这些有仓库的城市开面包店。(所以他只能开在其他地方了 QAQ)
当然,肯定有运费,对于每条路每运 1 千米就要支付 1 元。现在请问他最少要支付多少运费才能在一个城市开上面包店。当然,有可能根本就没法开面包店,那么就输出-1。
输入格式
第一行 3 个数 n,m,k
表示 n 个城市 m条道路 k 个仓库
接下来 m行
每行包括三个数 u,v,l,表示从 u 到 v 的距离为 l 的道路
接下来一行 k 个数,表示有仓库的城市编号。
输出格式
一个数,如果可以开面包店,那么输出花费最小值。
否则输出”−1”
样例一
input
5 4 2
1 2 5
1 2 3
2 3 4
1 4 10
1 5
output
3
思路:
假设黑点是仓库,其余点为可建立面包店的城市
则我们必会在两个红点中择小者,而不会选择绿点
所以只需在 所有 与仓库直接相连的 可建立面包店的城市中 选择路程最小的一个即可。
如果没有,输出-1
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100000+50;
int s[maxn],e[maxn],v[maxn],n,m,ans=-1,k,x;
bool can[maxn];
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&s[i],&e[i],&v[i]);
}
for(int i=1;i<=k;i++){
scanf("%d",&x);
can[x]=1;
}
for(int i=1;i<=m;i++){
if((can[s[i]]+can[e[i]])==1){
if((ans==-1)||ans>v[i]) ans=v[i];
}
}
printf("%d",ans);
return 0;
}