n k

n个节点的一棵树 k是距离

求树上有几对点距离<=k;

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector> using namespace std;
#define MAXN 100100 int head[MAXN];
bool vis[MAXN];
struct edg
{
int to,next,w;
}x[MAXN];
int cnt,ans,n,k,root;
int mi,num;
int mx[MAXN],size[MAXN],dis[MAXN]; //分别 是去掉这个点的子树最大节点数 以这个节点为根的子树包括的节点树(包括自己) 就一个存距离的数组 void add(int u,int v,int w)
{
x[cnt].next=head[u];
x[cnt].w=w;
x[cnt].to=v;
head[u]=cnt++;
}
void dfssize(int u,int fa) //树DP差不多 包括的节点
{
size[u]=;
mx[u]=;
for(int i=head[u];i!=-;i=x[i].next)
{
int v=x[i].to;
if(v!=fa&&!vis[v])
{
dfssize(v,u);
size[u]+=size[v];
if(size[v]>mx[u]) //这边子树更新一下 下面还有更新
mx[u]=size[v];
}
}
}
void dfsroot(int r,int u,int fa)
{
if(size[r]-size[u]>mx[u]) //根节点另外一边
mx[u]=size[r]-size[u];
if(mx[u]<mi) //找重心
{
mi=mx[u];
root=u;
}
for(int i=head[u];i!=-;i=x[i].next)
{
int v=x[i].to;
if(v!=fa&&!vis[v])
dfsroot(r,v,u);
}
}
void dfsdis(int u,int d,int fa)//存一下距离
{
dis[num++]=d;
for(int i=head[u];i!=-;i=x[i].next)
{
int v=x[i].to;
if(v!=fa&&!vis[v])
dfsdis(v,d+x[i].w,u);
}
}
int calc(int u,int d)
{
int ret=;
num=;
dfsdis(u,d,);
sort(dis,dis+num);
int i=,j=num-;
while(i<j) //自己模拟一下 算出有多少对
{
while(dis[i]+dis[j]>k&&i<j)
j--;
ret+=j-i;
i++;
}
return ret;
}
void dfs(int u)
{
mi=n;
dfssize(u,);
dfsroot(u,u,);
ans+=calc(root,); //这边算出来的还要减去 在它的一颗子树中(2个节点)如果满足 上面条件 其实并没什么用 但是多算了
vis[root]=;
for(int i=head[root];i!=-;i=x[i].next)
{
int v=x[i].to;
if(!vis[v])
{
ans-=calc(v,x[i].w); //所以这边要减掉
dfs(v);
}
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==k&&k==)
break;
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
ans=cnt=;
for(int i=;i<n;i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
add(a,b,w);
add(b,a,w);
}
dfs();
printf("%d\n",ans);
}
return ;
}

树分治 poj 1741的更多相关文章

  1. 点分治——POJ 1741

    写的第一道点分治的题目,权当认识点分治了. 点分治,就是对每条过某个点的路径进行考虑,若路径不经过此点,则可以对其子树进行考虑. 具体可以看menci的blog:点分治 来看一道例题:POJ 1741 ...

  2. 树上点分治 poj 1741

    Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v ...

  3. poj 1741 树的点分治(入门)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18205   Accepted: 5951 Description ...

  4. POJ 1741.Tree 树分治 树形dp 树上点对

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24258   Accepted: 8062 Description ...

  5. POJ 1741 树分治

    题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...

  6. poj 1741 Tree(树的点分治)

    poj 1741 Tree(树的点分治) 给出一个n个结点的树和一个整数k,问有多少个距离不超过k的点对. 首先对于一个树中的点对,要么经过根结点,要么不经过.所以我们可以把经过根节点的符合点对统计出 ...

  7. POJ 1741 Tree【树分治】

    第一次接触树分治,看了论文又照挑战上抄的代码,也就理解到这个层次了.. 以后做题中再慢慢体会学习. 题目链接: http://poj.org/problem?id=1741 题意: 给定树和树边的权重 ...

  8. poj 1741 楼教主男人八题之中的一个:树分治

    http://poj.org/problem? id=1741 Description Give a tree with n vertices,each edge has a length(posit ...

  9. 【POJ 1741】 Tree (树的点分治)

    Tree   Description Give a tree with n vertices,each edge has a length(positive integer less than 100 ...

随机推荐

  1. POJ3260The Fewest Coins[背包]

    The Fewest Coins Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6299   Accepted: 1922 ...

  2. 接入Google Play SDK

    更新 好消息:Unity5.3添加了google play.Mac .AppStore.windows store的IPA接口,我们做内购日后方便多啦!关于国内渠道的接入,推荐通用SDK平台,比如an ...

  3. [No000062]读书八字诀:怎样将书读得通透?

    从吃透到通透 有种说法,吃透一本书,才算好好读过.然而比吃透境界更高,是通透.吃透仅限于书中内容,通透则是将书中内容与正反上下.古今中外背景知识相互关联. 当你做到读书通透,收获将远远大于手头那一本书 ...

  4. Javascript备忘复习笔记2

    一.函数与形参 1.函数 function abs(x) { if (x >= 0) { return x; } else { return -x; } } alert(abs(-10)); 2 ...

  5. Lobes of the brain

    Source: https://en.wikipedia.org/wiki/Lobes_of_the_brain (Except for the last figure) Terminologia A ...

  6. 常用正则表达式大全!(例如:匹配中文、匹配html)

    一.常见正则表达式 匹配中文字符的正则表达式: [u4e00-u9fa5]    评注:匹配中文还真是个头疼的事,有了这个表达式就好办了  匹配双字节字符(包括汉字在内):[^x00-xff]  评注 ...

  7. BZOJ 1854 【Scoi2010】 游戏

    Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性 ...

  8. Linux 信号详解五(信号阻塞,信号未决)

    信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...

  9. noi题库(noi.openjudge.cn) 1.5编程基础之循环控制T36——T45

    T36 计算多项式的值 描述 假定多项式的形式为xn+xn-1+-+x2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值. 输入 输入仅一行,包括x和n,用单个空格隔开.x在flo ...

  10. JAVA CDI 学习(1) - @Inject基本用法

    CDI(Contexts and Dependency Injection 上下文依赖注入),是JAVA官方提供的依赖注入实现,可用于Dynamic Web Module中,先给3篇老外的文章,写得很 ...