当前位置: 首页 > news >正文

poj_1741——树的分治

看了网上各种大神的树的分治的模板,然后自己敲了一个。。。直接上代码了,晚上再写一个学习笔记, 丧心病狂的poj,上次一直跪在vector上,这次觉得不用vector写了。。。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <cstring>
#define ll long long
#define INF 1<<30

using namespace std;

const int N = 10000+5;
int cnt,s_max,rt,ans,n,k,num,list[N];///list表装的是整棵子树的节点
int size,ss[N];///size表示的是分出来的树的总结点数,ss表示该每颗子树的最大节点数
int son[N],d[N],head[N<<2]; ///保存节点子树的最大节点值
bool vis[N];///vis表示删除的节点

struct edge{
    int to,next;
    int w;
}e[N<<2];

void add_edge(int u,int v,int w){
    e[cnt].to = v;
    e[cnt].w = w;
    e[cnt].next = head[u];
    head[u] = cnt++;
}

///找重心
void dfs_0(int u,int fa){
    int tem = -1;
    son[u] = 1;
    list[size++] = u;
    for(int i = head[u];i != -1;i = e[i].next){
        int v = e[i].to;
        if(v == fa || vis[v]) continue;
        dfs_0(v,u);
        son[u] += son[v];
        tem = max(son[v],tem);
    }
    ss[u] = tem;
}

void getroot(int u,int fa){
    dfs_0(u,fa);
    s_max = INF;
    for(int i=0;i<size;i++){
        int tem = max(ss[list[i]],size-son[list[i]]);
        if(tem<s_max){
            rt = list[i];
            s_max = tem;
        }
    }
}

///求距离根的距离
void dfs(int u,int dis,int fa){
    d[num++] = dis;
    for(int i = head[u];i!=-1;i=e[i].next){
        int v = e[i].to;
        if(v != fa && !vis[v]){
            dfs(v,dis+e[i].w,u);
        }
    }
}

///计算节点对
int calc(int u,int dis){
    int ret = 0;
    num = 0;
    dfs(u,dis,-1);
    sort(d,d+num);
    int i = 0, j = num - 1;
    ///排序后统计点对的个数,o(n)的复杂度
    while(i < j)
    {
        while(d[i] + d[j] > k && i < j) j--;
        ret += j - i;
        i++;
    }
    return ret;
}

void solve(int u){
    size = 0;
    getroot(u,-1);
    ans += calc(rt,0);
    vis[rt] = true;
    for(int i = head[rt];i != -1;i=e[i].next){
        int v = e[i].to;
        if(!vis[v]){
            ans -= calc(v,e[i].w);
            solve(v);
        }
    }
}

void init(){
    memset(vis,false,sizeof(vis));
    memset(head,-1,sizeof(head));
    ans = 0;
    cnt = 0;
}

int main()
{
    freopen("test.in","r",stdin);
    while(scanf("%d%d",&n,&k)!=EOF && (n || k)){
        int x,y,dis;
        init();
        for(int i=0;i<n-1;i++){
            scanf("%d%d%d",&x,&y,&dis);
            add_edge(x,y,dis);
            add_edge(y,x,dis);
        }
        solve(1);
        printf("%d\n",ans);
    }
    return 0;
}


转载于:https://www.cnblogs.com/hqwhqwhq/p/4555883.html

相关文章:

  • vue中使用axios等异步方法this指向的问题
  • 教你学会Suse启动cron的方法
  • 关于BETA、RC、ALPHA、Release、GA等版本号的意义
  • 学习总结
  • 第十二周助教总结
  • 搞不清楚的302、303和307返回码
  • Mysql高级查询
  • Android学习(二十一)OptionsMenu选项菜单
  • React 高阶组件(HOC)实践
  • CMMI的SG/GG概念区别与SP/GP概念的区别
  • python函数声明与调用
  • 一些前端真正常用的工具和网站(会经常更新)
  • jenkins定时构建时间设置
  • 最快的捷径就是脚踏实地
  • 大闸蟹的 O O 第三单元日子——中测与强测的惨烈修罗场
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【翻译】babel对TC39装饰器草案的实现
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • angular学习第一篇-----环境搭建
  • CSS 提示工具(Tooltip)
  • CSS实用技巧干货
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java反射-动态类加载和重新加载
  • js 实现textarea输入字数提示
  • js递归,无限分级树形折叠菜单
  • leetcode讲解--894. All Possible Full Binary Trees
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 基于HAProxy的高性能缓存服务器nuster
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • python最赚钱的4个方向,你最心动的是哪个?
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • $L^p$ 调和函数恒为零
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (12)目标检测_SSD基于pytorch搭建代码
  • (13):Silverlight 2 数据与通信之WebRequest
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • **PHP分步表单提交思路(分页表单提交)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .md即markdown文件的基本常用编写语法
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .Net接口调试与案例
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET中winform传递参数至Url并获得返回值或文件
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /usr/bin/env: node: No such file or directory
  • @EnableAsync和@Async开始异步任务支持