求最短路,从s出发的第k小距离

链接:https://www.nowcoder.com/acm/contest/86/H

#include <iostream>
#include <math.h>
#include <sstream>
#include <algorithm>
#include <string.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <list>

typedef long long int ll;

#define PI 3.14159265358979323846
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3fll
#define maxn 100010
#define mod 1e9+7

using namespace std;

vector<pair<int, int>> vec[maxn];
ll dis[maxn];
bool vis[maxn];

struct cmp{
    bool operator()(int a,int b){
        return dis[a] > dis[b];
    }
};

priority_queue<int, vector<int>,cmp> que;

int main(int argc, char const *argv[]){
    int n,p,k;
    cin>>n>>p>>k;
    for(int i=1;i<=n;i++){
        vec[i].clear();
        dis[i]=INF;
        vis[i]=false;
    }
    dis[p]=0;
    int x,y,z;
    for(int i=1;i<n;i++){
        scanf("%d%d%d",&x,&y,&z);
        vec[x].push_back(make_pair(y, z));
        vec[y].push_back(make_pair(x, z));
    }
    que.push(p);
    for(int i=0;i<=k;i++){
        while(vis[que.top()])
            que.pop();
        p=que.top();
        que.pop();
        vis[p]=true;
        for(auto it=vec[p].begin();it!=vec[p].end();it++){
            if(!vis[it->first] && dis[it->first] > dis[p]+it->second){
                dis[it->first] = dis[p]+it->second;
                que.push(it->first);
            }
        }
    }
    cout<<dis[p]<<endl;
    return 0;
}

/*
6 4 3
1 2 7
2 3 2
2 4 2
2 5 10
3 6 3
 */


猜你喜欢

转载自blog.csdn.net/J__Max/article/details/80087591