码迷,mamicode.com
首页 > 其他好文 > 详细

点分治模板

时间:2019-01-09 18:54:14      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:nod   sizeof   clu   ios   ||   inf   string   ffffff   str   

poj 1741

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>

using std::sort;
using std::max;

const int maxn=10100;
const int inf=0x7fffffff;

struct node
{
    int p;
    int v;
    int nxt;
};

node line[maxn<<1];
int head[maxn],tail;
int f[maxn],size[maxn],dep[maxn],d[maxn],vis[maxn],tot;
int ans,sum,root;
int n,k;

void add(int a,int b,int c)
{
    line[++tail].p=b;
    line[tail].v=c;
    line[tail].nxt=head[a];
    head[a]=tail;
    return ;
}

void init()
{
    memset(vis,0,sizeof(f));
    memset(head,0,sizeof(head));
    tail=0;ans=0;
    //memset(f,0,sizeof(f));
    //memset(size,0,sizeof(f));
}

void get_hry(int now,int fa)
{
    f[now]=0;size[now]=1;
    int v;
    for(int i=head[now];i;i=line[i].nxt)
    {
        v=line[i].p;
        if(v==fa||vis[v])   continue;
        get_hry(v,now);
        size[now]+=size[v];
        f[now]=max(f[now],size[v]);
    }
    f[now]=max(f[now],sum-size[now]);
    if(f[root]>f[now])  root=now;
    return ;
}

void get_dep(int now,int fa)
{
    int v;d[++tot]=dep[now];
    size[now]=1;
    for(int i=head[now];i;i=line[i].nxt)
    {
        v=line[i].p;
        if(v==fa||vis[v])   continue;
        dep[v]=dep[now]+line[i].v;
        get_dep(v,now);
        size[now]+=size[v];
    }
    return ;
}

int calc(int now,int v)
{
    tot=0;dep[now]=v;
    get_dep(now,0);
    int l=1,r=tot,res=0;
    sort(d+1,d+tot+1);
    while(l<r)
    {
        if(d[l]+d[r]<=k)
        {
            res+=r-l;
            l++;
        }
        else
            r--;
    }
    return res;
}

void solve(int now)
{
    vis[now]=1;
    ans+=calc(now,0);
    int v;
    for(int i=head[now];i;i=line[i].nxt)
    {
        v=line[i].p;
        if(vis[v])  continue;
        ans-=calc(v,line[i].v);
        root=0;sum=size[v];
        get_hry(v,0);
        solve(root);
    }
    return ;
}

int main()
{
    while(true)
    {
        scanf("%d%d",&n,&k);
        if(!n||!k)  break;
        for(int i=1,a,b,c;i<n;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
            add(b,a,c);
        }
        f[0]=inf;sum=n;
        get_hry(1,0);
        solve(root);
        printf("%d\n",ans);
        init();
    }
    return 0;
}

点分治模板

标签:nod   sizeof   clu   ios   ||   inf   string   ffffff   str   

原文地址:https://www.cnblogs.com/Lance1ot/p/10245850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!