RE求助
查看原帖
RE求助
147401
koishi_offical楼主2021/10/10 21:55
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e5+10;
int h[N],e[N],ne[N],w[N],idx;
void add(int a,int b,int c)
  {
      e[++idx]=b;
      ne[idx]=h[a];
      h[a]=idx;
      w[idx]=c;
  }
int n,m,sum;
int d[N];
int num;
void dfs(int x,int f,int len)
  {
      int ss=0;
      for(int i=h[x];i;i=ne[i])
        if(e[i]!=f)
          {
              dfs(e[i],x,len);
          }
      const int az=ss;
      vector<int> stk;
      stk.push_back(0);
      int top=0;
      for(int i=h[x];i;i=ne[i])
        if(e[i]!=f) stk.push_back(d[e[i]]+w[i]),top++;
      sort(stk.begin(),stk.end());
      while(stk[top]>=len)
        {
            top--;
            num++;
        }
      int l=1,r=top,maxn=0;
      while(r-l>=1)
        {
            for(;stk[l]+stk[r]<len;l++) maxn=max(maxn,l);
            if(l<r)
              {
                  num++;
                  l++,r--;
              }
        }
      if(l==r) maxn=l;
      d[x]=stk[maxn];
      stk.clear();
  }
bool got(int len)
  {
      memset(d,0,sizeof(d));
      num=0;
      dfs(1,0,len);
      if(num>=m) return 1;
      else return 0;
  }
signed main() {
    cin>>n>>m;
    for(int i=1;i<n;i++)
      {
          int a,b,c;
          cin>>a>>b>>c;
          add(a,b,c);
          add(b,a,c);
          sum+=c;
      }
    int l=0,r=sum,ans;
    //cout<<sum<<endl;
    while(l<=r)
      {
          int mid=l+r>>1;
          if(got(mid)) l=mid+1,ans=mid;
          else r=mid-1;
      }
    cout<<ans;
}
2021/10/10 21:55
加载中...