链接: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
*/