40分求调(玄关)
查看原帖
40分求调(玄关)
704655
CAICAIA楼主2024/5/10 18:58
#include<bits/stdc++.h>
using namespace std;
const long long MX=201000,INF=0x3f3f3f3f3f3f3f3f;
vector<pair<long long,long long > >vec[MX];
inline void Add(long long x,long long y,long long w){
    vec[x].push_back(make_pair(y,w));
}
inline bool cmp(pair<long long,long long> a,pair<long long,long long> b){
    return a.first<b.first;
}
long long n,k,rot=1;
long long dist[MX]={0};
void dfs(long long now,long long fa){
    for(auto j:vec[now]){
        long long to=j.first,w=j.second;
        if(to==fa)  continue;
        dist[to]=dist[now]+w;
        dfs(to,now);
    }
}
long long sum=0,mid,lf;
void dfs1(long long now,long long fa){
    for(auto j:vec[now]){
        long long to=j.first,w=j.second;
        if(to==fa)  continue;
        lf+=w*2;
        if(lf>mid)  sum++,lf=dist[to]*2;
        dfs1(to,now);
    }
}
bool check(){
    lf=0;sum=1;
    // printf("%lld=================\n",mid);
    dfs1(rot,0);
    return sum<=k;
}
signed main(){
    scanf("%lld%lld",&n,&k);
    for(long long i=1;i<n;i++){
        long long x,y,w;scanf("%lld%lld%lld",&x,&y,&w);
        Add(x,y,w);Add(y,x,w);
    }
    for(long long i=1;i<=n;i++)  sort(vec[i].begin(),vec[i].end(),cmp);
    // for(long long i=1;i<=n;i++){
    //     printf("%lld: ",i);
    //     for(auto j:vec[i])  printf("%lld ",j.first);
    //     printf("\n");
    // }
    dfs(1,0);
    long long l=1,r=1e17,ans;
    while(l<=r){
        mid=l+r>>1;
        if(check()){
            r=mid-1;
            ans=mid;
        }
        else  l=mid+1;
    }
    printf("%lld",ans);
    return 0;
}//P6058
2024/5/10 18:58
加载中...