[codeforces1196F]K-th Path

time limit per test : 2.5 seconds
memory limit per test : 256 megabytes

You are given a connected undirected weighted graph consisting of nn vertices and mm edges.

You need to print the kk-th smallest shortest path in this graph (paths from the vertex to itself are not counted, paths from ii to jj and from jj to ii are counted as one).
More formally, if dd is the matrix of shortest paths, where di,j is the length of the shortest path between vertices ii and j(1i<jn)j (1≤i<j≤n), then you need to print the k-th element in the sorted array consisting of all di,j, where 1i<jn1≤i<j≤n.
Input

The first line of the input contains three integers n,mn,m and k(2n2105,n1mmin(n(n1)/2,2105),1kmin(n(n1)/2,400)k (2≤n≤2⋅10^5, n−1≤m≤min(n(n−1)/{2},2⋅10^5), 1≤k≤min(n(n−1)/2,400) — the number of vertices in the graph, the number of edges in the graph and the value of kk, correspondingly.

Then mm lines follow, each containing three integers xx, yy and w(1x,yn,1w109,xy)w (1≤x,y≤n, 1≤w≤10^9, x≠y) denoting an edge between vertices xx and yy of weight ww.

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 xx and yy, there is at most one edge between this pair of vertices in the graph).

Output

Print one integer — the length of the kk-th smallest shortest path in the given graph (paths from the vertex to itself are not counted, paths from ii to jj and from jj to ii 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

題意:
給定一個無向圖
要求做出求出兩兩點之間距離中,第kk小的那個
k<=400k<=400

題解:
考慮將所有現有距離丟到小根堆中
然後每次取出一個點對及其之間距離更新新的距離加入小根堆
一共做kk次即可

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章