POJ-1741 点分治

POJ 1741:点分治详解 题意:给出一个n( 点分治:顾名思义,点分治就是对点进行分治,一般用于路经统计问题。对每个点而言,一条路径要么经过他,要么不经过他,这就是分,即分成路径经过此点和不经过此点。基本思想是:当经过某点的路径可以比较方便快速统计的情况下,通过对点进行分治,把树的规模不断变小。 考虑这样做的好处:把树看作无根树,除了叶子结点外,去掉任意一个点,都可以把一棵树分裂成若干规模更小的树。然后 阅读详情
Tree
Time Limit: 1000MS Memory Limit: 30000K
Total Submissions: 18156 Accepted: 5930

Description

Give a tree with n vertices,each edge has a length(positive integer less than 1001). 
Define dist(u,v)=The min distance between node u and v. 
Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not exceed k. 
Write a program that will count how many pairs which are valid for a given tree. 

Input

The input contains several test cases. The first line of each test case contains two integers n, k. (n<=10000) The following n-1 lines each contains three integers u,v,l, which means there is an edge between node u and v of length l. 
The last test case is followed by two zeros. 

Output

For each test case output the answer on a single line.

Sample Input

5 4
1 2 3
1 3 1
1 4 2
3 5 1
0 0

Sample Output

8

Source

LouTiancheng@POJ


题目链接:

http://poj.org/problem?id=1741


题目大意:

        计算树上距离不超过k的点对数目,n<=10000。


解题思路:

        点分治模板题。


AC代码:

import java.util.*;

public class Main {
	static int n,k,a,b,c,ee,ans,ct;
	static int[] mm=new int[10005];
	static int[] mx=new int[10005];
	static int[] dis=new int[10005];
	static int[] size=new int[10005];
	static int[] head=new int[10005];
	static int[] edge=new int[20005];
	static int[] next=new int[20005];
	static int[] cost=new int[20005];
	static void add(int a,int b,int c)
	{
		edge[ee]=b;next[ee]=head[a];
		cost[ee]=c;head[a]=ee++;
	}
	static void dfs(int u)
	{
		getsize(u,0);
		int rt=getroot(u,0,u);
		ans+=cal(rt,0);
		mm[rt]=1;int v;
		for(int i=head[rt];i!=-1;i=next[i])
		{
			v=edge[i];
			if(mm[v]==1) continue;
			ans-=cal(v,cost[i]);
			dfs(v);
		}
	}
	static int cal(int u,int d)
	{
		int res=0;ct=0;
		getdis(u,0,d);
		Arrays.sort(dis,1,ct+1);
		int i=1,j=ct;
		while(i<j)
		{
			while(dis[i]+dis[j]>k&&i<j)
				j--;
			res+=j-i;i++;
		}
		return res;
	}
	static void getdis(int u,int fa,int d)
	{
		dis[++ct]=d;int v;
		for(int i=head[u];i!=-1;i=next[i])
		{
			v=edge[i];
			if(mm[v]==1||v==fa) continue;
			getdis(v,u,d+cost[i]);
		}
	}
	static void getsize(int u,int fa)
	{
		size[u]=1;mx[u]=0;
		int v;
		for(int i=head[u];i!=-1;i=next[i])
		{
			v=edge[i];
			if(mm[v]==1||v==fa) continue;
			getsize(v,u);
			size[u]+=size[v];
			mx[u]=Math.max(mx[u],size[v]);
		}
	}
	static int getroot(int u,int fa,int r)
	{
		int res=u,v,p;
		mx[u]=Math.max(mx[u],size[r]-size[u]);
		for(int i=head[u];i!=-1;i=next[i])
		{
			v=edge[i];
			if(mm[v]==1||v==fa) continue;
			p=getroot(v,u,r);
			if(mx[p]<mx[res]) res=p;
		}
		return res;
	}

	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		while(in.hasNext())
		{
			n=in.nextInt();k=in.nextInt();
			if(n==0&&k==0) break;
			Arrays.fill(head,-1);ee=0;
			for(int i=1;i<n;i++)
			{
				a=in.nextInt();b=in.nextInt();
				if(a>b) { c=a;a=b;b=c;}
				c=in.nextInt();
				add(a,b,c);add(b,a,c);
			}
			Arrays.fill(mm,0);ans=0;
			dfs(1);
			System.out.println(ans);
		}
	}
}


【poj 1741】Tree 【树分治 点分治入门题】 Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18550   Accepted: 6069 Description Give a tree with n vertices,each edge has a length(positive integer l 阅读详情

相关推荐

高通AI Engine SDK(QNN)使用教程(环境配置、模型转换、量化、推理、分析)

高通AI Engine使用教程

weixin_51031772的博客 1万+

POJ 1741(点分治)

题目链接:http://poj.org/problem?id=1741   题目大意:一棵树上有多少条边小于k   题目思路:使用点分治,先建图,然后对树进行递归,先得到以1为根节点各个点的子节点数量,然后通过这个获取树的重心。树的重心就是所有点当中,他的子树的最大节点数最小。sum是当前树的所有节点数量,然后-siz[x]就是x这个节点面朝节点1的那棵子树的节点数量 然后就可以找出...

smilestruggler_Fly To Higher 779

EAST算法(Efficient and Accuracy Scene Text))

1.EAST模型简介 本文介绍的文本检测模型EAST,便简化了中间的过程步骤,直接实现端到端文本检测,优雅简洁,检测的准确性和速度都有了进一步的提升。如下图: 其中,(a)、(b)、(c)、(d)是几种常见的文本检测过程,典型的检测过程包括候选框提取、候选框过滤、bouding box回归、候选框合并等阶段,中间过程比较冗长。而(e)即是本文介绍的EAST模型检测过程,从上图可看出,其过程简化为只有FCN阶段(全卷积网络)、NMS阶段(非极大抑制),中间过程大大缩减,而且输出结果支持文本行、单词的多个角度

博客 9579

poj1741点分治

poj1741点分治 题意: 有一颗n节点树,计算有多少对节点满足距离小于等于k 输入: 多组输入 每组:一个正整数n代表树的节点数,一个正整数k代表最大距离 #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> using namespace std; typedef long long ll; #defi

qq_51316118的博客 334

多思计算机组成原理实验:模型机课程设计

计算机组成原理实验教程 基于多思网络虚拟实验系统 张雯雰

Nick的博客 2万+

STM32G0实战:手把手教你用国产GD25Q16 Flash存储传感器数据(附完整驱动)

本文详细介绍了如何使用国产GD25Q16 Flash芯片与STM32G0系列MCU实现传感器数据存储的完整方案。从SPI接口配置、驱动层实现到存储系统架构设计,提供了实战代码和优化策略,帮助开发者快速构建高性价比的物联网数据存储系统。

weixin_30733003的博客 107

poj1741(点分治)

点分治这个算法听了一年了,最近没有比赛就学了一下。 题面 题意:给你一棵树,问距离小于等于L 的点对有多少个。 点分治定义了一个叫重心的点。即是割去它后最大的连通块最小的点。然后有证明最大的连通块大小不大于总点数的一半。 对于这题,先找到重心x,然后要处理的便是经过点x的路径。可以用dfs求出所有点到x的距离,然后排序,单调寻找点对。 若有两个点来自同一个连通块,它们分别到x的距离的和小

KKiseki的博客 1125

静止无功补偿SVG的基本控制原理

上图是自励单变量控制框图,基本控制方式为,采集计算得到负载无功电流和SVG输出的无功电流的差值,经过PI调节作为功率角δ和固定的调制深度λ和调制波,经过PWM调制形成开关信号驱动SVG的功率电路。该控制方式使保持调制深度λ(即SVG电压的幅度)不变,通过调整δ来调整直流电压和无功,跟踪输出无功功率,直流电压就会大幅度随动,无功相应速度较慢。SVG通常有他励方式和自励方式,他励方式需要提供外部的直流电源,自励方式通过电网输出有功功率至SVG建立SVG的直流电压。δ为Us和Uc之间的相角差。

weixin_42668920的博客 1992

poj 1741(点分治)

题目链接:http://poj.org/problem?id=1741 给定一颗树,以及k,一次询问,找出所有路径长度小于等于k的点对数。 前置:flag[]数组表示删除的点,d[]数组代表节点到根节点的距离,b[]数组代表节点属于哪一颗子树,a[]子树中所有的节点(并按照d从小到大排序),size1[]数组表示编号为i的子树的大小,cnt[]数组表示编号为i的子树出现的次数。 首先我...

cy41的博客 278

S7-200SMART PLC中进行MODBUS RTU通信的3种方法(1)

S7-200SMART PLC中进行MODBUS RTU通信的3种方法(1)

Robot_PLC_HMI_Automation 4241

【AI智能体】Claude Code 核心记忆文件 CLAUDE.md实战操作详解

Claude Code 核心记忆文件 CLAUDE.md实战操作详解

congge 5459

【点分治】poj1741

众所周知,树分治有两种:点分治和边分治。顾名思义,点分治是按点进行分治,为了让子问题的规模尽量小,我们通常选择重心做为分治的点;而边分治通常选择使得所分离出来的两棵子树的结点个数尽量平均的边。求重心和这样的边均可以用树DP的方法解决。通常点分治和边分治的递归层数为O(logn)O(log_n),在实际运用中,边分治的层数经常达到O(n)O(n)效率低下…… 以上均属于扯淡……关于树的分治有一篇IO

336

11、Windows Autopilot 部署与设备注册全攻略

本文详细介绍了Windows Autopilot的完整部署流程,涵盖注册配置文件设置、注册状态页面(ESP)配置、设备注册方法(包括CSV导入、JSON注入、在线注册等)、自动化脚本实现及故障排除技巧。通过手动与PowerShell自动化两种方式指导用户完成配置,并提供流程图、最佳实践和常见问题解答,帮助IT管理员高效实现设备零接触部署与管理。

ii567的博客 343

POJ 1741: 树上点分治

POJ 1741: Tree

十飏 de FATMOUSE. 549

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

POJ 1741 树的点分治

对于树上的路径问题,一种高效的处理方式就是分治算法。关于树分治算法的研究,详见2009年IOI国家集训队论文——《分治算法在树的路径问题中的应用》。     通常对于树上的分治算法有两种,第一种是针对点进行的分治,另一种是针对边进行的分治,可以证明,大部分情况下点分治算法的性能更加稳定,而边分治在某些情况下,算法效率非常低。所以以下主要讨论点分治。     如POJ-1741,求解一棵树中路径

Bahuia的博客 1099

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

POJ 1741 点分治

题意 传送门 POJ 1741 Tree 题解 以 ppp 为根的树上长度为 kkk 的路径分为两种其情况:经过 ppp 的路径;不经过 ppp 的路径。递归求解,每一层求解经过当前子树根节点的答案。将树上节点按照与根节点的距离排序,则可由用左右指针扫描数组统计满足求和不大于 kkk 的路径 (u−p,p−v)(u-p,p-v)(u−p,p−v) 对数量。考虑 DFSDFSDFS 的时间戳,子树节点位置的编号是相邻的,那么可以预先统计同一棵子树上的路径对数,最后用整棵树的路径对数减去它,就得到了经过根节点的

neweryyy的博客 285

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

poj 1741 Tree 点分治

// poj 1741 Tree 点分治 // 题目链接: // http://poj.org/problem?id=1741 // 题目大意: // 给定一棵N(1<=N<=10000)个结点的带权树,定义dist(u,v)为u,v两点间的最短路径长度, // 路径的长度定义为路径上所有边的权和。再给定一个K(1<=K<=1e9),如果对于不同的两个 // 结点

TIMELIMITE的专栏 741

POJ1741 点分治模板题

在B站看了点分治后,照着敲了模板题 https://www.bilibili.com/video/av53560289?from=search&seid=8511450481402711616 点分治感觉根之前学的CDQ,启发式分治,等很像,都是先分再治。 分的复杂度尽量logn,治的复杂度线性或带上logn。 即:递归logn层,每层的复杂度在可控范围内。 树上点分治:顾名思义...

bjfu170203101的博客 225

POj 1741 树的点分治

看了漆子超的论文好像懂了一点点,就动手写了一下POJ1741。 发现树的点分治其实也不是那么难,其主要流程好像就是不断地找当前子树的重心,处理重心的子树的答案,同时通过某种操作合并得到当前以重心为根的子树的答案。 #include #include #include #include #include #include #include using namespace std;

ACM交流帖 259

POJ 1741 Tree 树的分治(点分治)

题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离 思路:树的点分治。利用递归和求树的重心来解决这类问题。因为满足题意的点对一共只有两种: 1.在以该节点的子树中且不经过该节点。 2.路径经过该节点。 对于第一种点,我们递归处理;第二种点,我们可以将所有子树的节点到这个子树的根节点的距离处理出来,然后排序处理出满足要求的点对的个数。 按照正常的树的结构来分割子树,这样

(╯°口°)╯(┴—┴ 1107

poj 1741 (点分治入门)

poj 1741 (点分治入门) 09年漆子超论文第二题。 点分治,关键是重心的性质。定义:在一棵树上找到一点u使得删除u后所有分开的子树中size最大的子树最小,则u为重心。其性质是所有分开的子树的size必然不超过(N/2),那么就可以做到nlogn了。这题还有排序这部分,所以整体复杂度是nlog(n)log(n)。 代码: #include #include #include

No__stop 1173

解题报告:POJ1741 Tree 树上点分治(经典好题)

Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 19522   Accepted: 6388 Description Give a tree with n vertices,each edge has a length(positive integer les

Hee的博客~ 514

POJ1741 Tree + BZOJ1468 Tree 【点分治】

POJ1741 Tree + BZOJ1468 Tree Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)=The min distance between node u and v. Give an in...

Dream_maker的博客 287

poj1741 tree 点分治

poj1741 tree 把这几天写的东西上传一下 写博客的意义大概就是整理一下思路 以及方便日后复习 不得不说 把代码放在文件夹里 做完我是不会过目的 写博客 或许会增加我的成就感 从而 会多注意一下吧 哈哈 csdn现在也高大上了很多嘛 poj1741 Tree 题目大意:求(u,v)满足dis(u,v) 点分治 LNWC2016新学到的 Orz 大概是 把所有的边分为经过

yxr0105 451

POJ 1741 Tree 点分治

POJ 1741 一道点分治模板题 树上距离小于等于k 实际上由于是最短距离 我们在统计上级子树的时候容易把下面子树内的情况考虑进去 导致多选 所以要给下面子树加爸爸边的贡献 删除这些影响 这点也是点分治的精华所在 /* POJ 1741 */ #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;queue&gt; #i...

我是谁 --- 卡比兽 162
上一篇: HDU-5371 Manacher+线段树维护
下一篇: 快速傅里叶变换入门
AC_Machine
博客等级 码龄11年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值