上午学习了点分治,写了1个半小时终于写出一个代码--poj1741,可以说是个模板题。

  分治:对于每个儿子找出重心,分别处理

  注意:1.每次处理一个重心后,ans减去对它儿子的处理

      原因:因为统计方法没管是否在同一棵树上,所以答案有重复

     2.每次寻找新的重心时,树的大小变化,重新计算大小,否则TLE

CODE:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#define ll long long
#define inf 2147483647
#define N 10005
using namespace std;
int n,k,dis[N],f[N],siz[N],vis[N],rt,ans,size;
struct node{
int v,w;
};
vector<int>d;
vector<node>g[N]; void getrt(int u,int fa){
siz[u]=1;f[u]=0;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v;
if(vis[v]||v==fa)continue;
getrt(v,u);
siz[u]+=siz[v];
f[u]=max(f[u],siz[v]);
}
f[u]=max(f[u],size-siz[u]);
if(f[u]<f[rt])rt=u;
} void getdis(int u,int fa){
d.push_back(dis[u]);
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(vis[v]||v==fa)continue;
dis[v]=dis[u]+w;
getdis(v,u);
}
} int cal(int u,int fir){
int ret=0;
d.clear();
dis[u]=fir;
getdis(u,0);
int l=0,r=d.size()-1;
sort(d.begin(),d.end());
while(l<r){
while(d[l]+d[r]>k&&l<r)r--;
ret+=r-l;l++;
}
return ret; } void work(int u){
ans+=cal(u,0);
vis[u]=1;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(vis[v])continue;
ans-=cal(v,w);
f[0]=size=siz[u];
getrt(v,rt=0);
work(rt);
}
} int main(){
while(1){
scanf("%d%d",&n,&k);
if(!n)break;
for(int i=1;i<=n;i++)
g[i].clear(),vis[i]=0;
int u,v,w;
for(int i=1;i<n;i++)
scanf("%d%d%d",&u,&v,&w),
g[v].push_back(node{u,w}),
g[u].push_back(node{v,w});
ans=0;f[0]=size=n;
getrt(1,rt=0);
work(rt);
printf("%d\n",ans);
}
return 0;
}

  

poj1741Tree 点分治的更多相关文章

  1. Poj1741-Tree(树分治)

    题意:找树上有多少对距离小于K的对数解析:树分治模板题,见注释 代码 #include<cstdio> #include<cstring> #include<string ...

  2. POJ1741Tree [点分治]【学习笔记】

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20098   Accepted: 6608 Description ...

  3. POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12276   Accepted: 3886 Description ...

  4. 2018.07.31 POJ1741Tree(点分治)

    传送门 只是来贴一个点分治的板子(年轻时候写的丑别介意). 代码: #include<cstdio> #include<cstring> #include<algorit ...

  5. poj1741-Tree(树的分治)

    题意:给一棵树,求树上长度小于等于k的链的数量. 题解:http://blog.csdn.net/yang_7_46/article/details/9966455 照着这个博客写的代码. 不到100 ...

  6. 点分治&&动态点分治学习笔记

    突然发现网上关于点分和动态点分的教程好像很少……蒟蒻开篇blog记录一下吧……因为这是个大傻逼,可能有很多地方写错,欢迎在下面提出 参考文献:https://www.cnblogs.com/LadyL ...

  7. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  8. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  9. [poj1741][tree] (树/点分治)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

随机推荐

  1. 数据结构与算法 —— 链表linked list(02)

    我们继续来看链表的第二道题,来自于leetcode: 两数相加 给定两个非空链表来代表两个非负整数,位数按照逆序方式存储,它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了 ...

  2. 将Python程序打包为exe方法

    将Python程序打包为exe文件,需要使用到的工具是pyinstaller pyinstaller是一个多平台的Python程序打包为exe的免费工具 安装pyinstaller: 1,在Windo ...

  3. CentOS7.4下的 JDK1.8 安装

    一.卸载老的JDK 如果需要卸载OpenJDK,执行以下操作: [root@localhost ~]# rpm -e --nodeps tzdata-java-2014i-1.el7.noarch[r ...

  4. Linux CentOS7.0 (03)安装验证 docker

    一.安装docker 1.升级 Linux 的软件包和内核 sudo yum update 2.安装 docker (1) sudo yum install docker  (2).验证docker安 ...

  5. spring1——IOC之原理

    spring框架的核心是IOC和AOP. 控制反转--IOC是一种编程思想,在spring中指的是对象的装配和管理交给了spring容器.这样做的好处是降低了系统之间的偶合度,既调用者不用再去创建被调 ...

  6. Archaius 原理

    Archaius 原理 Archaius是什么? Archaius提供了动态修改配置的值的功能,在修改配置后,不需要重启应用服务.其核心思想就是轮询配置源,每一次迭代,检测配置是否更改,有更改重新更新 ...

  7. python/MySQL练习题(二)

    python/MySQL练习题(二) 查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T ...

  8. tornado解决高并发的初步认识牵扯出的一些问题

    #!/bin/env python # -*- coding:utf-8 -*- import tornado.httpserver import tornado.ioloop import torn ...

  9. 新手创建Vue项目

    ======================安装vue=============================(参考网址:http://www.bubuko.com/infodetail-21320 ...

  10. [转]Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...