55pt求助(答案偏大)
查看原帖
55pt求助(答案偏大)
456675
a_sad_soul楼主2023/10/11 18:52
#include<bits/stdc++.h>
#define MAXN 50005
using namespace std;
struct node{
    int to;
    int next;
    int dis;
}e[MAXN<<1];
int head[MAXN],tot;
void add(int u,int v,int w)
{
    e[++tot].to=v;
    e[tot].dis=w;
    e[tot].next=head[u];
    head[u]=tot;
}
bool vis[MAXN];
int total;
int n,m;
struct Sort{
    int val;
    bool used;
    Sort(int a){val=a,used=0;}
};
bool cmp(Sort a,Sort b){return a.val<b.val;}
bool cmpSort(Sort a,Sort b){return a.val<b.val;}
int dfs(int u,int minn)
{
    vector<Sort>q;
    vis[u]=1;
    for(int i=head[u];i;i=e[i].next)
    {
        int v=e[i].to;
        int dis=e[i].dis;  
        if(vis[v])continue;
        int E=dfs(v,minn)+e[i].dis;
        if(E>=minn){total--;continue;}
        if(E!=0)
        q.push_back(Sort(E));
    }
    sort(q.begin(),q.end(),cmp);
    for(int i=0;i<q.size();++i)
    {
        auto p=lower_bound(q.begin()+i+1,q.end(),minn-q[i].val,cmpSort);
        if(p==q.end())continue;
        q[i].used=1;
        total--;//cout<<q[i].val+p->val<<" "<<total<<" "<<minn<<endl;
        q.erase(p);
    }
    for(int i=q.size()-1;i>=0;++i)
        {if(q[i].used==0){return q[i].val;}}
    return 0;
}
void divide()
{
    int l=0,r=100000000;
    int ans,mid;
    
    while(l<=r)
    {
        mid=(l+r)>>1;
        memset(vis,0,sizeof(vis));
        total=m;
        dfs(1,mid);
        if(total<=0)ans=mid,l=mid+1;
        else r=mid-1;
    }
    printf("%d\n",ans);
}
int main()
{
    //freopen("P5021_12.in","r",stdin);
    //freopen("P5021.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;++i){
        int a,b,l;
        scanf("%d%d%d",&a,&b,&l);
        add(a,b,l),add(b,a,l);
    }
    divide();
    return 0;
}
2023/10/11 18:52
加载中...