【POJ 1741】Tree
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 11570 | Accepted: 3626 |
Description
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 last test case is followed by two zeros.
Output
Sample Input
5 4
1 2 3
1 3 1
1 4 2
3 5 1
0 0
Sample Output
8
Source
我的点分治第一题~~~
树上的路径分为两类:
经过根结点。不经过根结点。
那么我们能够选择每个点为根,然后计算经过这个根结点的长度<=k的路径,再依照同样的方法计算他的全部子树中的路径条数,这样就能不重不漏。
怎样计算经过根结点且长度<=k的路径条数?
用全部的减去在同一棵子树中的就能够。
怎么计算全部的长度<=k的路径?
用dfs求出每一个点的深度,存在一个数组里。然后从小到大排个序。用两个指针扫:l=1,r=tot,在l添加的过程中满足dep[l]+dep[r]<=k的r指针是不增的,所以O(n)能够出解,再加上sort的O(nlogn)。这个操作的复杂度为O(nlogn)。
所以总的复杂度为O(递归层数*nlogn)。怎样让递归层数最少?
每次让重心(找重心【POJ 1655】)当根结点,递归层数是logn的。
于是总复杂度为O(nlog^2n)~
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#define M 10005
using namespace std;
struct edge
{
int y,ne,l;
}e[M*100];
int ans,all,h[M],f[M],done[M],s[M],dep[M],tot=0,size,n,k,root;
void Addedge(int x,int y,int l)
{
tot++;
e[tot].y=y;
e[tot].ne=h[x];
e[tot].l=l;
h[x]=tot;
}
void Getroot(int x,int fa)
{
f[x]=0;
s[x]=1;
for (int i=h[x];i;i=e[i].ne)
{
int y=e[i].y;
if (y==fa||done[y]) continue;
Getroot(y,x);
s[x]+=s[y];
f[x]=max(f[x],s[y]);
}
f[x]=max(f[x],size-s[x]);
if (f[x]<f[root]) root=x;
}
void Getdep(int x,int fa,int de)
{
dep[++all]=de;
s[x]=1;
for (int i=h[x];i;i=e[i].ne)
{
int y=e[i].y,l=e[i].l;
if (y==fa||done[y]) continue;
Getdep(y,x,de+l);
s[x]+=s[y];
}
}
int calc(int x,int de)
{
int an=0;
all=0;
Getdep(x,0,de);
sort(dep+1,dep+1+all);
for (int l=1,r=all;l<r;)
if (dep[l]+dep[r]<=k) an+=r-l++;
else r--;
return an;
}
void Solve(int x)
{
ans+=calc(x,0);
done[x]=true;
for (int i=h[x];i;i=e[i].ne)
{
int y=e[i].y;
if (done[y]) continue;
ans-=calc(y,e[i].l);
size=f[0]=s[y];
Getroot(y,root=0);
Solve(root);
}
}
int main()
{
while (scanf("%d%d",&n,&k)==2)
{
if (n==k&&n==0) break;
tot=0;
for (int i=1;i<=n;i++)
h[i]=0,done[i]=false;
for (int i=1;i<n;i++)
{
int x,y,l;
scanf("%d%d%d",&x,&y,&l);
Addedge(x,y,l);
Addedge(y,x,l);
}
ans=0;
f[0]=size=n;
Getroot(1,root=0);
Solve(root);
printf("%d\n",ans);
}
return 0;
}
感悟:
1.TLE是由于Solve(root)。写成Solve(y)了。。
2.点分治的关键是要知道路径分经过根结点和不经过根结点,由此找到递归方法。
【POJ 1741】Tree的更多相关文章
- 【POJ 1741】 Tree (树的点分治)
Tree Description Give a tree with n vertices,each edge has a length(positive integer less than 100 ...
- 【POJ 1741】 Tree
[题目链接] http://poj.org/problem?id=1741 [算法] 点分治 要求距离不超过k的点对个数,不妨将路径分成两类 : 1. 经过根节点 2. 不经过根节点 考虑第1类路径, ...
- 【POJ 2486】 Apple Tree(树型dp)
[POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8981 Acce ...
- 【POJ 2750】 Potted Flower(线段树套dp)
[POJ 2750] Potted Flower(线段树套dp) Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4566 ...
- bzoj 2295: 【POJ Challenge】我爱你啊
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- BZOJ2293: 【POJ Challenge】吉他英雄
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
- BZOJ2287: 【POJ Challenge】消失之物
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
随机推荐
- 1数组的join方法
function log(e) { console.log(e) } 有时候写console.log太长了,所以会自己写个这样的函数省去写console的步骤. 数组的join方法可以把一个数组按照j ...
- GnuWin,包括FLEX BISON GREP
https://sourceforge.net/projects/gnuwin32/files/?source=navbar
- html5 canvas 实现一个简单的叮当猫头部
原文:html5 canvas 实现一个简单的叮当猫头部 html5的canvas是很强大的,今天也是温习了一下之前的基础知识,然后学着做了一个简单的小案例.虽然在这一块几乎空白,但还是乐于尝试... ...
- Mockito文档-单元测试技术
Overview Package Class Use Tree Deprecated Index Help PREV CLASS NEXT CLASS FRAMES ...
- Paip.断点调试MYSQL存储过程跟函数的解决方案大法
Paip.断点调试MYSQL存储过程跟函数的解决方案大法 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- 论文阅读笔记 - Mesos: A Platform for Fine-Grained ResourceSharing in the Data Center
作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 更多论文阅读笔记 http:/ ...
- JSP自定义标签——简单标签(2)
在前一篇博客中,我们已经学习了自定义的简单标签的基本使用方法,这一篇我们来学习如何在简单标签中添加标签属性.对自定义标签添加一些属性,可以使我们的标签功能更加灵活和复用.例如前一篇博客使用简单标签来对 ...
- 基于visual Studio2013解决面试题之0308Fibonacci数列
题目
- 用asio的定时器实现带超时的connect,备忘
// test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <boost/asio.hpp> #inclu ...
- 中介者模式 C++ 实现
#include<iostream> #include<string> #include<vector> #include<cstdlib> using ...