武
题号:NC15522
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
其次,Sεlιнα(Selina) 要进行体力比武竞赛。
在 Sεlιнα 所在的城市,有 NN 个街区,编号为 1∼N1∼N,总共有 N−1N−1 条的街道连接这些街区, 使得每两个街区之间都直接或间接地有街道将它们相连。Sεlιнα 把通过了文化知识竞赛的参赛男友们召集到她家所在的街区 PP ,并以这个街区为起点,让所有参赛男友们向其他街区跑去。这些参赛者们被命令不准重复跑某条街道,而且在规定时间内要尽可能地跑远。比赛结束后,所有参赛者将停留在他们此时所在的街区。之后 Sεlιнα 开始视察结果。现在她知道每个街区都有一些她的参赛男友停留着,她现在想先去看看离她家第 KK 近的街区。所以作为一位好帮手,你的任务是要告诉她所有街区中,离 Sεlιнα 家第 KK 近的街区与 Sεlιнα 家之间的距离。
输入描述:
第一行三个整数,N,P,KN,P,K,含义同题面描述。
接下去 N−1N−1 行,每行三个整数,u,v,wu,v,w,表示从第 uu 个街区到第 vv 个街区有一条权值为ww 的街道相连。街区从 11 开始标号。
输出描述:
输出共一行,一个整数,表示所有街区与 Sεlιнα 家所在街区之间最近距离的第 KK 小值。
示例1
输入
3 3 2 1 2 4 2 3 5
输出
9
示例2
输入
6 4 3 1 2 7 2 3 2 2 4 2 2 5 10 3 6 3
输出
7
备注:
2≤N≤1000002≤N≤100000 1≤w≤20001≤w≤2000
/*
*@Author: GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int MAXN = 305;
const int INF = 0x3f3f3f3f;
const int N=5e4+7;
const int maxn=1e5+5;
const double EPS=1e-10;
const double Pi=3.1415926535897;
//inline double max(double a,double b){
// return a>b?a:b;
//}
//inline double min(double a,double b){
// return a<b?a:b;
//}
int xd[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int yd[8] = {1, 0, -1, 0, -1, 1, -1, 1};
//start
const int MAX= 1e5+10;
struct node {
int x,to,next,w;
bool operator <(const node &a) const{
return this->w>a.w;
}
}G[MAX<<1]; //结构体存图
int n,k,s;
int cnt;
int dis[MAX];
int vis[MAX];
int head[MAX];
void add(int u,int v,int w){ //前向星存图
G[++cnt].to=v;
G[cnt].w=w;
G[cnt].next=head[u];
head[u]=cnt;
}
void dijkstra(int s){
mms(dis,INF);
dis[s]=0;
priority_queue<node> p; //优先队列
node t;
t.x=s;
t.w=0;
p.push(t);
while (!p.empty()) {
node u=p.top();
p.pop();
int v=u.x;
if(dis[v]!=u.w) continue;
for(int i=head[v];i;i=G[i].next){
int to=G[i].to;
if(dis[to]>dis[v]+G[i].w){
dis[to]=dis[v]+G[i].w;
t.x=to;
t.w=dis[to];
p.push(t);
}
}
}
}
int main(){
cin>>n>>s>>k;
int a,b,c;
for(int i=1;i<n;i++){
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
dijkstra(s);
sort(dis+1,dis+1+n);
cout<<dis[k+1];
}
//end