POJ 1741 树上的点分治
题目大意:
找到树上点对间距离不大于K的点对数
这是一道简单的练习点分治的题,注意的是为了防止点分治时出现最后分治出来一颗子树为一条直线,所以用递归的方法求出最合适的root点
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm> using namespace std;
#define N 10005
int n , m , k , first[N]; struct Edge{
int y , next , d;
Edge(){}
Edge(int y , int next , int d):y(y),next(next),d(d){}
}e[N<<]; void add_edge(int x , int y , int d)
{
e[k] = Edge(y , first[x] , d);
first[x] = k++;
} int sz[N] , dis[N] , f[N] , d[N] , cnt , root , ret;
bool use[N]; void find_root(int u , int fa , int size)
{
sz[u] = , f[u] = ;
int v;
for(int i=first[u] ; ~i ; i=e[i].next){
if(use[v=e[i].y] || v==fa) continue;
find_root(v , u , size);
sz[u] += sz[v] ;
f[u] = max(f[u] , sz[v]);
}
f[u] = max(f[u] , size-sz[u]);
if(f[u]<f[root]) root = u;
} void dfs(int u , int fa)
{
d[cnt++] = dis[u];
sz[u] = ;
int v;
for(int i=first[u] ; ~i ; i=e[i].next){
if(use[v=e[i].y] || v==fa) continue;
dis[v] = dis[u]+e[i].d;
if(dis[v]>m) continue;
dfs(v , u);
sz[u] += sz[v];
}
} int cal(int u , int val)
{
dis[u] = val , cnt=;
dfs(u , );
sort(d , d+cnt);
int ret = ;
for(int l= , r=cnt- ; l<r ; )
if(d[l]+d[r]<=m) ret+=r-l++;
else r--;
return ret;
} void solve(int u)
{
ret+=cal(u , );
use[u] =true;
int v;
for(int i=first[u] ; ~i ; i=e[i].next){
if(use[v=e[i].y]) continue;
ret -= cal(v , e[i].d);
find_root(v , root= , sz[v]);
solve(root);
}
} int main()
{
// freopen("in.txt" , "r" , stdin);
int x,y,d;
while(scanf("%d%d" , &n , &m) , n+m)
{
memset(first , - , sizeof(first));
k = ;
for(int i= ; i<n ; i++){
scanf("%d%d%d" , &x , &y , &d);
add_edge(x , y , d);
add_edge(y , x , d);
}
memset(use , , sizeof(use));
ret= , f[] = 1e9;
find_root( , root= , n);
solve(root);
printf("%d\n" , ret);
}
}
POJ 1741 树上的点分治的更多相关文章
- POJ 1741 树上 点的 分治
题意就是求树上距离小于等于K的点对有多少个 n2的算法肯定不行,因为1W个点 这就需要分治.可以看09年漆子超的论文 本题用到的是关于点的分治. 一个重要的问题是,为了防止退化,所以每次都要找到树的重 ...
- poj 1741 树的点分治(入门)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 18205 Accepted: 5951 Description ...
- POJ 1741 树的点分治
题目大意: 树上找到有多少条路径的边权值和>=k 这里在树上进行点分治,需要找到重心保证自己的不会出现过于长的链来降低复杂度 #include <cstdio> #include & ...
- POJ 1741 Tree 树的分治
原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...
- POJ 1741 Tree【树分治】
第一次接触树分治,看了论文又照挑战上抄的代码,也就理解到这个层次了.. 以后做题中再慢慢体会学习. 题目链接: http://poj.org/problem?id=1741 题意: 给定树和树边的权重 ...
- poj 1741 Tree(点分治)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15548 Accepted: 5054 Description ...
- POJ 1741 Tree (树分治入门)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8554 Accepted: 2545 Description ...
- POJ 1741 Tree (点分治)
Tree Time Limit: 1000MS Memory ...
- POJ 1741 Tree 树的分治(点分治)
题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中 ...
随机推荐
- 关于Socket的经验小结
前言 IM通信在互联网发展到现在已经是码农的世界里人尽皆知的技术,特别在当下移动互联网迅猛发展的时代这种技术的开发也更加火热,其中老牌的代表作就有QQ和MSN,和最近新崛起的微信,默默,易信,来往等眼 ...
- QT对话框模式与非模式
QT模态对话框及非模态对话框 非模态对话框(Modeless Dialog)的概念不是模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于在模态来显示对 ...
- canvas调节视频颜色
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何使用Retrofit获取服务器返回来的JSON字符串
有关Retrofit的简单集成攻略,大家可以参考我此前的一篇文章有关更多API文档的查阅请大家到Retrofit官网查看. 在大家使用网络请求的时候,往往会出现一种情况:需要在拿到服务器返回来的JSO ...
- 青少年如何使用 Python 开始游戏开发
这是一篇由教程团队成员Julian Meyer发表的文章,一个12岁的python开发人员.你可以在Google+和Twitter上找到他. 你可曾想过如何创建视频游戏吗?它不像你想象的那么复杂! 在 ...
- [maven] 跳过单元测试
1.mvn命令 $ mvn install -Dmaven.test.skip=true 2.通过配置pom <project> [...] <build> <plugi ...
- 小而美的js程序
1.获取数字数组最小值的索引 function _getMinKey(arr) { var a = arr[0]; var b = 0; for (var k in arr) { if (arr[k] ...
- IDEA 创建Java Web项目
发现项目目录没有classes和lib目录,所以自己创建 点击OK,选中"Jar Directroy"-->点击"OK" 然后直接把jar复制到这个目录下 ...
- Java 之 I/O 系列 01 ——基础
Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 整理<疯狂j ...
- Q: How could I use MATLAB interface for parameter selection?
Q: How could I use MATLAB interface for parameter selection? One can do this by a simple loop. See t ...