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.在以该节点的子树中 ...
随机推荐
- 2 CSS
2 CSS CSS基础 html 在一个网页中负责的事情是一个页面的结构css(层叠样式表) 在一个网页中主要负责了页面的数据样式. 编写css代码的方式: 第一种: 在style标签中编写c ...
- 列车时刻表查询 jqm/ajax/xml
<!doctype html><html lang="en"><head> <meta charset="UTF-8" ...
- Hbase之尝试使用错误列族获取数据
import com.google.common.base.Strings; import org.apache.hadoop.conf.Configuration; import org.apach ...
- 初识Ildasm.exe——IL反编译的实用工具
原文地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662307.html Ildasm.exe 概要: 一.前言: 微软的IL反 ...
- IE7局部滚动区域下绝对定位或相对定位元素不随滚动条滚动的bug
尽管在项目中测试人员已经慢慢淡化了IE6的测试,但是IE7依然还是要纳入测试范围. 最近碰到一个IE7的蛋疼bug,在页面上设置了一个局部的滚动区域,在拖动滚动条的时候,滚动区域内设置了相对定位或绝对 ...
- hdu 1026 Ignatius and the Princess I (bfs+记录路径)(priority_queue)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1026 Problem Description The Princess has been abducted ...
- JavaWeb学习-Tomcat
打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- Python--关于 join 和 split
.join() join将 容器对象 拆分并以指定的字符将列表内的元素(element)连接起来,返回字符串(注:容器对象内的元素须为字符类型) >>> a = ['no','pai ...
- iOS 中对 HTTPS 证书链的验证
这篇文章是我一边学习证书验证一边记录的内容,稍微整理了下,共扯了三部分内容: HTTPS 简要原理: 数字证书的内容.生成及验证: iOS 上对证书链的验证. HTTPS 概要 HTTPS 是运行在 ...
- 用XmlSerializer进行xml反序列化的时候,程序报错: 不应有 <xml xmlns=''>
原因 一,类型错误: 比如xml本来是UserInfo类型 用XmlSerializer进行反序列化传入的类型是MemberInfo这就会报错 二,xml根节点和对象的类名不一致,而又没有对类加入[X ...