POJ1741:tree
时隔一个月再次写点分治,比上一次要深入理解很多了。(虽然代码还是写不熟
模板题,不多说
- //POJ 1741
- //by Cydiater
- //2016.9.22
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <algorithm>
- #include <queue>
- #include <map>
- #include <ctime>
- #include <cmath>
- #include <cstdlib>
- #include <iomanip>
- #include <iostream>
- using namespace std;
- #define ll long long
- #define up(i,j,n) for(int i=j;i<=n;i++)
- #define down(i,j,n) for(int i=j;i>=n;i--)
- const int MAXN=1e6+5;
- const int oo=0x3f3f3f3f;
- inline int read(){
- char ch=getchar();int x=0,f=1;
- while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
- while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
- return x*f;
- }
- int N,K,LINK[MAXN],len=0,root,siz[MAXN],sum,max_siz[MAXN],ans,dis[MAXN],head,tail,q[MAXN];
- bool vis[MAXN];
- struct edge{
- int y,next,v;
- }e[MAXN];
- namespace solution{
- inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}
- void init(){
- if(N==0&&K==0)exit(0);
- len=ans=root=0;
- memset(LINK,0,sizeof(LINK));
- memset(vis,0,sizeof(vis));
- up(i,2,N){
- int x=read(),y=read(),v=read();
- insert(x,y,v);
- insert(y,x,v);
- }
- }
- void make_root(int node,int fa){
- siz[node]=1;max_siz[node]=0;
- for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
- make_root(e[i].y,node);
- siz[node]+=siz[e[i].y];
- max_siz[node]=max(max_siz[node],siz[e[i].y]);
- }
- max_siz[node]=max(max_siz[node],sum-max_siz[node]);
- if(max_siz[node]<max_siz[root])root=node;
- }
- void get_deep(int node,int fa){
- q[++tail]=dis[node];
- for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y]&&e[i].y!=fa){
- dis[e[i].y]=dis[node]+e[i].v;
- get_deep(e[i].y,node);
- }
- }
- int col(int node,int dist){
- int tmp=0;
- dis[node]=dist;head=1;tail=0;
- get_deep(node,0);
- sort(q+1,q+tail+1);
- while(head<tail){
- while(q[head]+q[tail]>K&&head<tail)tail--;
- tmp+=tail-head;
- head++;
- }
- return tmp;
- }
- void work(int node){
- ans+=col(node,0);vis[node]=1;
- for(int i=LINK[node];i;i=e[i].next)
- if(!vis[e[i].y]){
- ans-=col(e[i].y,e[i].v);
- sum=siz[e[i].y];root=0;
- make_root(e[i].y,node);
- work(root);
- }
- }
- void slove(){
- root=N;sum=0;max_siz[0]=oo;
- make_root(1,0);
- work(root);
- }
- void output(){
- printf("%d\n",ans);
- }
- }
- int main(){
- //freopen("input.in","r",stdin);
- using namespace solution;
- while(scanf("%d %d",&N,&K)!=EOF){
- init();
- slove();
- output();
- }
- return 0;
- }
POJ1741:tree的更多相关文章
- POJ1741 Tree + BZOJ1468 Tree 【点分治】
POJ1741 Tree + BZOJ1468 Tree Description Give a tree with n vertices,each edge has a length(positive ...
- POJ1741 Tree(树分治——点分治)题解
题意:给一棵树,问你最多能找到几个组合(u,v),使得两点距离不超过k. 思路:点分治,复杂度O(nlogn*logn).看了半天还是有点模糊. 显然,所有满足要求的组合,连接这两个点,他们必然经过他 ...
- [poj1741][tree] (树/点分治)
Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...
- POJ1741 tree 【点分治】
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25286 Accepted: 8421 Description ...
- POJ1741 Tree(树的点分治基础题)
Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v) ...
- POJ1741 Tree (点分治)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25772 Accepted: 8566 Description ...
- POJ1741——Tree(树的点分治)
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...
- POJ-1741 Tree (树上点分治)
题目大意:一棵带边权无根树,边权代表距离,求距离小于等于k的点对儿数. 题目分析:这两个点之间的路径只有两种可能,要么经过根节点,要么在一棵子树内.定义depth(i)表示点 i 到根节点的距离,be ...
- poj1741 Tree(点分治)
题目链接:http://poj.org/problem?id=1741 题意:求树上两点之间距离小于等于k的点对的数量 思路:点分治模板题,推荐一篇讲的非常好的博客:https://blog.csdn ...
随机推荐
- 知乎UWP 预览
又是很久都没有写博客了,为了表达歉意,奉上一个新的App,O(∩_∩)O! 因为商店的知乎太多了,然而,,所以一直打算自己动手写一个. 近段时间有些假期加上课程不是很忙,抽时间写了这个知乎.商店链接 ...
- android 使用多个接口
今天,好久没有这么用过都忘记可以这样用了.来记录下: 一个类想要使用多个接口可以implements 接口1 , 接口2,...
- jq实现登陆页面的拖拽功能
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <script src ...
- oracle数据泵实现不同用户之间的导出导入
来源于:http://www.cnblogs.com/kevinsun/archive/2007/02/03/638803.aspx http://blog.sina.com.cn/s/blog_68 ...
- VS2015中GLAUX库的链接问题
最近学习OpenGL,照着例子写了个程序,用到了GLAUX库. #include <gl\glaux.h> #pragma comment(lib, "glaux") ...
- jquery 获取Select option 选择的Text和Value
jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关设置 获取一组radio被选中项的值:var item = $(' ...
- iOS开发中的错误整理,iOS9之后的UIWindow(TopWindow)以及UIWindow与statusBar的关系
iOS9之后的UIWindow的问题(TopWindow),以及UIWindow与statusBar之间的联系 1.出现的问题 iOS9之后UIWindow必须要指定一个根控制器,不然会报错!iOS9 ...
- jQuery常用的元素查找方法总结
$("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("di ...
- 【codevs1012】最大公约数和最小公倍数
题目描述 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整 ...
- PHP递归生成树形数组
数据表结构 id name pid ){ foreach($data as $row){ if($row['pid']==$p_id){ $tmp = $this->tree( ...