#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define int long long
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vii;
typedef vector<bool> vb;
typedef tree<pii,null_type,less<pii>,rb_tree_tag,
tree_order_statistics_node_update> oset;
#define fi first
#define se second
#define pb push_back
#define mid (l+r)/2
#define all(x) x.begin(),x.end()
#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)
#define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl;
#define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;
#define sp <<" "<<
#define DEBUG(x) cout<<(#x) sp x<<endl
const int INF=1e18;
const int MAXN=2e5+5;
int n,k;
vii adj[MAXN];
int cur;
int tut[MAXN]; //eşleşmemiş max uzaktakini tutacak
int park[MAXN]; //closest parkı tutacak
bool mark[MAXN], used[MAXN];
set<int> res;
void dfs(int nd,int ata){
park[nd]=INF;
tut[nd]=0;
set<pii> s,p;
int c=0;
for(auto [kom,cost]:adj[nd]){
if(kom==ata) continue;
dfs(kom,nd);
if(!(tut[kom]==0 and used[kom])){
if(tut[kom]+cost>cur){
//park yap
mark[kom]=true;
park[kom]=0;
tut[kom]=0;
used[kom]=true;
}
}
if(park[kom]!=INF){
park[nd]=min(park[nd],park[kom]+cost);
s.insert({park[kom]+cost,kom});
}
}
for(auto [kom,cost]:adj[nd]){
if(kom==ata) continue;
if(tut[kom]==0 and used[kom]) continue; //taşınacak yok
if(tut[kom]+cost<=cur){ //ataya çıkabilen komşu
if(s.empty()){
tut[nd]=max(tut[nd],tut[kom]+cost);
}
else if(s.size()==1){
auto it=s.begin();
auto deg=*it;
if(deg.se==kom) tut[nd]=max(tut[nd],tut[kom]+cost);
else{
if(deg.fi+tut[kom]+cost>cur){
//eşleşemedi
tut[nd]=max(tut[nd],tut[kom]+cost);
}
}
}
else{
auto it=s.begin();
auto deg=*it;
if(deg.se==kom){
it++;
deg=*it;
}
if(deg.fi+tut[kom]+cost>cur){
//eşleşemedi
tut[nd]=max(tut[nd],tut[kom]+cost);
}
}
}
}
//ben eşleşiyor muyum bak
if(park[nd]<=cur){
used[nd]=true;
}
}
bool check(int x){
vi ans;
cur=x;
FORE(i,1,n+1){
mark[i]=used[i]=false;
}
dfs(1,-1);
if(!used[1] or tut[1]>0) mark[1]=true;
FORE(i,1,n+1){
if(mark[i]) ans.pb(i);
}
if(ans.size()<=k){
res.clear();
for(auto el:ans) res.insert(el);
return true;
}
return false;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
FOR(i,n-1){
int a,b,c;
cin>>a>>b>>c;
adj[a].pb({b,c});
adj[b].pb({a,c});
}
int l=-1;
int r=INF;
while(l+1<r){
if(check(mid)) r=mid;
else l=mid;
}
int i=1;
while(res.size()<k) res.insert(i++);
cout<<r<<endl;
cont(res);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |