点分治TLE90pts求调!!
查看原帖
点分治TLE90pts求调!!
581928
jasonliujiahua楼主2023/12/19 14:59
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e6+10,inf=1e9;
int n,k,cnt,rt,num,ans=inf,mx[maxn],sz[maxn],dis[maxn];
int dep[maxn],mn[maxn],d1[maxn],d2[maxn];
bool vis[maxn];
queue<int> q;
struct edge
{
    int u,v,w,nxt;
}e[maxn<<1];
int head[maxn];
inline void add(int x,int y,int z)
{
    e[++cnt]=(edge){x,y,z,head[x]};
    head[x]=cnt;
}
void init()
{
    cin>>n>>k;
    for(int i=1;i<n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    for(int i=1;i<=k;i++) mn[i]=inf;
}
void getrt(int u,int f,int tot)
{
    sz[u]=1;
    mx[u]=0;
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(v==f || vis[v]) continue;
        getrt(v,u,tot);
        sz[u]+=sz[v];
        mx[u]=max(mx[u],sz[v]);
    }
    mx[u]=max(mx[u],tot-sz[u]);
    if(mx[u]<mx[rt]) rt=u;
}
void getdis(int u,int f)
{
    d1[++num]=dis[u];
    d2[num]=dep[u];
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(v==f || vis[v]) continue;
        dis[v]=dis[u]+e[i].w;
        dep[v]=dep[u]+1;
        getdis(v,u);
    }
}
void calc(int u)
{
    mn[0]=0;
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(vis[v]) continue;
        dis[v]=e[i].w;
        dep[v]=1;
        num=0;
        getdis(v,u);
        for(int j=1;j<=num;j++) 
            if(k-d1[j]>=0)
                ans=min(ans,mn[k-d1[j]]+d2[j]);
        for(int j=1;j<=num;j++)
        {
            if(k-d1[j]<0) continue;
            q.push(d1[j]);
            mn[d1[j]]=min(mn[d1[j]],d2[j]);
        }
    }
    while(q.size()) mn[q.front()]=inf,q.pop();
}
void solve(int u)
{   
    vis[u]=1;
    calc(u);
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(vis[v]) continue;
        rt=0;
        getrt(v,u,sz[v]);
        solve(rt);
    }
}
int main()
{
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    init();
    mx[0]=inf;
    getrt(1,0,n);
    solve(rt);
    if(ans==inf) cout<<-1;
    else cout<<ans;
    return 0;
}
2023/12/19 14:59
加载中...