poj1741Tree 点分治
上午学习了点分治,写了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 点分治的更多相关文章
- Poj1741-Tree(树分治)
题意:找树上有多少对距离小于K的对数解析:树分治模板题,见注释 代码 #include<cstdio> #include<cstring> #include<string ...
- POJ1741Tree [点分治]【学习笔记】
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20098 Accepted: 6608 Description ...
- POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12276 Accepted: 3886 Description ...
- 2018.07.31 POJ1741Tree(点分治)
传送门 只是来贴一个点分治的板子(年轻时候写的丑别介意). 代码: #include<cstdio> #include<cstring> #include<algorit ...
- poj1741-Tree(树的分治)
题意:给一棵树,求树上长度小于等于k的链的数量. 题解:http://blog.csdn.net/yang_7_46/article/details/9966455 照着这个博客写的代码. 不到100 ...
- 点分治&&动态点分治学习笔记
突然发现网上关于点分和动态点分的教程好像很少……蒟蒻开篇blog记录一下吧……因为这是个大傻逼,可能有很多地方写错,欢迎在下面提出 参考文献:https://www.cnblogs.com/LadyL ...
- [bzoj2152][聪聪和可可] (点分治+概率)
Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- [poj1741][tree] (树/点分治)
Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...
随机推荐
- Unix下zfs文件系统重组RAID-5后可以这样恢复
存储做的RAID-5, SCSI硬盘,操作系统是FreeBSD,文件系统是zfs.本案例共有12块硬盘,11块硬盘里有数据,1块硬盘是热备盘.其中第6块数据硬盘出现故障,重组时需要将其剔除. 物理盘: ...
- nyoj 数的长度
描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)? 输入 首行输入n,表示有多少组测试数据(n<1 ...
- 【编程开发】PHP---面向对象
面向对象编程 类:在现实世界中,任何事物都有种类的概念:车 类是由特征和行为构成的. 特征:都是不动的,从出厂的时候就已经内置好了(属性) 行为:一种动的状态.(方法(函数)) 行为依赖于这些特征,而 ...
- JAVA_SE基础——14.循环结构语句
建议有些基础的同学阅读,0基础可能会有些困难(最好看正文配合基础课本的例子) 所谓循环语句主要就是在满足条件的情况下反复执行某一个操作.Java提供了3种常用的循环语句,分别为for循环语句.whil ...
- JAVA_SE基础——1.JDK&JRE下载及安装
这是我学了JAVA来写的第一篇博客: 我首先是在传智播客领了张.毕向东老师的免费JAVA学习光盘来学习! 下面我来教大家安装使用JAVA时候必备的JDK 1.首先上甲骨文公司的官方网站下载JDK的安装 ...
- Web Api 利用 cors 实现跨域
一.安装 cors 二.修改 Web.config <appSettings> <add key="cors:allowedMethods" value=&quo ...
- C# 启动 SQL Server 服务
//首先要添加 System.ServiceProcess.dll 引用 ServiceController sc = new ServiceController("MSSQLSERVER& ...
- PHP模式设计之单例模式、工厂模式、注册树模式、适配器模式、观察者模式
php模式设计之单例模式 什么是单例模式? 单例模式是指在整个应用中只有一个实例对象的设计模式 为什么要用单例模式? php经常要链接数据库,如果在一个项目中频繁建立连接数据库,会造成服务器资源的很大 ...
- python中文编码坑
打印list的时候unicode对象不会自动转为中文!
- spark2.1:读取hive中存储的多元组(string,double)失败
这两天和同事一起在想着如何把一个表的记录减少,表记录包含了:objectid(主小区信息),gridid(归属栅格),height(高度),rsrp(主小区rsrp),n_objectid(邻区),n ...