time limit per test : 2.5 seconds
memory limit per test : 256 megabytes
You are given a connected undirected weighted graph consisting of vertices and edges.
You need to print the
-th smallest shortest path in this graph (paths from the vertex to itself are not counted, paths from
to
and from
to
are counted as one).
More formally, if
is the matrix of shortest paths, where di,j is the length of the shortest path between vertices
and
, then you need to print the k-th element in the sorted array consisting of all di,j, where
.
Input
The first line of the input contains three integers and — the number of vertices in the graph, the number of edges in the graph and the value of , correspondingly.
Then lines follow, each containing three integers , and denoting an edge between vertices and of weight .
It is guaranteed that the given graph is connected (there is a path between any pair of vertices), there are no self-loops (edges connecting the vertex with itself) and multiple edges (for each pair of vertices and , there is at most one edge between this pair of vertices in the graph).
Output
Print one integer — the length of the
-th smallest shortest path in the given graph (paths from the vertex to itself are not counted, paths from
to
and from
to
are counted as one).
Examples
Input
6 10 5
2 5 1
5 3 9
6 2 2
1 3 1
5 1 8
6 5 10
1 6 5
6 4 6
3 6 2
3 4 5
Output
3
Input
7 15 18
2 6 3
5 7 4
6 5 4
3 6 9
6 7 7
1 6 4
7 1 6
7 2 1
4 3 2
3 2 8
5 3 6
2 5 5
3 7 9
4 1 8
2 1 1
Output
9
题意:
给定一个无向图
要求做出求出两两点之间距离中,第
小的那个
题解:
考虑将所有现有距离丢到小根堆中
然后每次取出一个点对及其之间距离更新新的距离加入小根堆
一共做
次即可
#include<bits/stdc++.h>
#define ll long long
#define paa pair<ll,pair<int,int> >
using namespace std;
priority_queue<paa,vector<paa>,greater<paa> >q;
map<int,ll>mp[200004];
int n,m,k;
int getu(paa A){
return A.second.first;
}
int getv(paa A){
return A.second.second;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
while(!q.empty())q.pop();
for(int i=1;i<=n;i++)mp[i].clear();
for(int i=1;i<=m;i++){
int u,v,w;scanf("%d%d%d",&u,&v,&w);
q.push({1LL*w,{u,v}});
}
ll ans=0;
while(k&&(!q.empty())){
paa now=q.top();q.pop();
int u=getu(now),v=getv(now);
if(mp[u].count(v))continue;
for(auto x:mp[u]){
q.push({x.second+now.first,{v,x.first}});
}
for(auto x:mp[v]){
q.push({x.second+now.first,{u,x.first}});
}
mp[v][u]=mp[u][v]=now.first;
ans=now.first;
k--;
}
printf("%lld\n",ans);
return 0;
}