// RandomUsername (Nikola Jovanovic) // Contest Name // Problem Name #include #define DBG false #define debug(x) if(DBG) printf("(ln %d) %s = %d\n", __LINE__, #x, x); #define lld long long #define ff(i,a,b) for(int i=a; i<=b; i++) #define fb(i,a,b) for(int i=a; i>=b; i--) #define par pair #define fi first #define se second #define mid (l+r)/2 #define INF 1000000000 #define MAXN 100005 using namespace std; struct node { vector adj; vector ws; int parent; int parw; int level; int sumtop; }; int n, k; node g[MAXN]; int st[MAXN][20]; void parents(int curr, int level, int sum) { g[curr].sumtop = sum; g[curr].level = level; int sz = g[curr].adj.size(); ff(i, 0, sz-1) { int nxt = g[curr].adj[i]; if(g[curr].parent == nxt) continue; g[nxt].parent = curr; g[nxt].parw = g[curr].ws[i]; parents(nxt, level+1, sum + g[curr].ws[i]); } } int cnt_l(int sum) { int keep = sum; int ret = 0; //how many sums less than sum? ff(i, 1, n) { sum = keep; int LO = i; //each node //find the largest sum less than sum fb(deg, 17, 0) { int HI = st[LO][deg]; if(HI == -1) continue; int currS = g[LO].sumtop - g[HI].sumtop; if(currS >= sum) continue; else { sum -= currS; LO = HI; ret += (1 << deg); //levelsClimbed } } } return ret; } int main() { scanf("%d %d", &n, &k); ff(i, 1, n-1) { int u, v, w; scanf("%d %d %d", &u, &v, &w); g[u].adj.push_back(v); g[u].ws.push_back(w); g[v].adj.push_back(u); g[v].ws.push_back(w); } g[1].parent = -1; parents(1, 0, 0); ff(j, 0, 17) { //2^j th parent ff(i, 1, n) { if(j == 0) { st[i][j] = g[i].parent; } else { if(st[i][j-1] != -1) st[i][j] = st[ st[i][j-1] ][j-1]; else st[i][j] = st[i][j-1]; } } } // binsrch the actual sum int hi = INF; int lo = 0; while(hi > lo) { int pivot = (hi + lo) / 2 + 1; int L = cnt_l(pivot); //NAJVECI TAKO DA MU JE CNT_L < K if(L >= k) {hi = pivot - 1;} else {lo = pivot;} // L < K } printf("%d\n", hi); return 0; }