Problem D. Distance
题目连接:
http://codeforces.com/gym/100714
Description
In a large city a cellular network operator is holding a competition for subscribers to promote their new
“pedestrian navigator” service. The main prize will be awarded to the first pair of subscribers to meet
each other. The competition ends when any such meeting takes place.
At the start of the competition all the subscribers are at their known positions, are able to see each other
on their smartphones, and are moving at a constant speed of 10 km/h taking only pedestrian walks. Each
subscriber is willing to win the prize and is indifferent to the others.
In order to prepare for an award ceremony the cellular network operator needs to know the minimal
amount of time after which the competition may come to an end.
Input
In the first line of input integers N, K, and L are given — the number of subscribers in a cellular network
company (2 ≤ N ≤ 105
), the number of junctions (1 ≤ K ≤ 105
), and the number of pedestrian walks
(1 ≤ L ≤ 105
) in the city, respectively.
On the next N lines of input Si (1 ≤ Si ≤ K) numbers are given — initial positions of subscribers (in
the terms of transport graph junctions).
The next L lines of input pedestrian paths are given in the form of integers Bi
, Ci and Di separated
by spaces. Each line denotes that there is a two-way pedestrian path between junctions Bi and Ci
(1 ≤ Bi
, Ci ≤ K, Bi 6= Ci) with a length of Di (1 ≤ Di ≤ 5000) kilometers.
Output
Output the minimal possible number of minutes that may elapse from the start till the end of the contest.
It is guaranteed that at least one pair of the subscribers can meet.
Sample Input
2 2 1
1
2
1 2 5
Sample Output
15
Hint
题意
有n个关键点,这个图一共有m个点,l条边,问你两个关键点之间最短距离是多少
题解:
暴力dij就好了,记录一下这个点的最短路是谁。
然后边松弛边统计答案就好了
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+6;
const int inf = 1e9+1e7;
vector<pair<int,int> > E[maxn];
int n,k,l;
int vis[maxn],use[maxn],dis[maxn],color[maxn];
vector<int> st;
int main(){
scanf("%d%d%d",&n,&k,&l);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
st.push_back(x);
}
for(int i=1;i<=l;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
E[a].push_back(make_pair(b,c));
E[b].push_back(make_pair(a,c));
}
int ans = inf;
for(int i=1;i<=k;i++){
dis[i]=inf;
vis[i]=-1;
}
set<pair<int,int> >S;
for(int i=0;i<st.size();i++){
dis[st[i]]=0;
color[st[i]]=i;
S.insert(make_pair(0,st[i]));
if(use[st[i]]){
ans=0;
}
use[st[i]]=1;
}
while(!S.empty()){
int now = S.begin()->second;
S.erase(S.begin());
for(int i=0;i<E[now].size();i++){
int x = E[now][i].first;
int v = E[now][i].second;
if(color[x]!=color[now]&&color[x]!=-1)
ans=min(ans,v+dis[x]+dis[now]);
if(dis[x]>dis[now]+v){
S.erase(make_pair(dis[x],x));
dis[x]=dis[now]+v;
color[x]=color[now];
S.insert(make_pair(dis[x],x));
}
}
}
cout<<ans*3<<endl;
}