这题和poj 1741是一模一样的

但是1741能AC的代码,在这里却是TLE,暂时没看出哪里出现了问题。。

AC代码:

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 40000+5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f #define ls (rt<<1)
#define rs (rt<<1|1) int n,m,k; int ans,root,tot,ptr = ,K,son[MAXN],head[MAXN],f[MAXN],dist[MAXN],d[MAXN],sum,vis[MAXN]; struct node{int y,next,v;}tree[MAXN<<]; void add(int u,int v,int w) {tree[ptr].y=v;tree[ptr].v=w;tree[ptr].next=head[u];head[u]=ptr++;} void getroot(int x,int fa)
{
son[x] = ;
f[x] = ;
for(int i=head[x];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(y == fa || vis[y]) continue;
getroot(y,x);
son[x] += son[y];
f[x] = max(f[x] , son[y]);
}
f[x] = max(f[x] , sum - son[x]);
if(f[x] < f[root]) root = x;
} void getdis(int x,int fa)
{
if(d[x] <= K) dist[tot++]=d[x];
for(int i=head[x];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(y == fa || vis[y]) continue;
d[y] = d[x] + tree[i].v;
getdis(y,x);
}
} int cal(int x,int now)
{
d[x]=now;
tot = ;
getdis(x,);
sort(dist,dist+tot);
int all = ,left=,right = tot-;
while(left<right)
{
if(dist[left]+dist[right] <= K) {all+=right-left;left++;}
else right--;
}
return all;
}
void solve(int x)
{
ans+=cal(x,);
vis[x] = ;
for(int i=head[x];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(vis[y]) continue;
ans-=cal(y,tree[i].v);
sum = son[y];
root = ;
getroot(y,root);
solve(root);
}
}
void init()
{
mem(head,-);
ptr = ;
ans = root = ;
mem(vis,);
sum=n;
f[]=INF;
} int main()
{
while(~sf("%d%d",&n,&m))
{
init();
for(int i=;i<n;i++)
{
int x,y,z;char ch[];
sf("%d%d%d%s",&x,&y,&z,ch);
add(x,y,z);
add(y,x,z);
}
sf("%d",&K);
getroot(,);
solve(root);
pf("%d\n",ans);
} }

1741可AC,这题TLE

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 40000+5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f #define ls (rt<<1)
#define rs (rt<<1|1) int n,m,k; int ptr = ,head[MAXN],vis[MAXN],f[MAXN],d[MAXN]; int ans,tot,rt,sum,son[MAXN],dis[MAXN],mu[MAXN]; struct node
{
int y,val,next;
}tree[MAXN<<]; void init()
{
mem(tree,);
mem(head,-);
mem(vis,);
mem(dis,);
ans = ;
ptr = ;
sum = n;
f[] = INF;
} void add(int fa,int son,int val)
{
tree[ptr].y = son;
tree[ptr].val = val;
tree[ptr].next = head[fa];
head[fa] = ptr++;
} void getroot(int root,int fa)
{
son[root] = ;
f[root] = ;
for(int i=head[root];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(vis[y] || y == fa) continue;
getroot(y,root);
son[root] += son[y];
f[root] = max(son[y],f[root]);
}
f[root] = max(f[root],sum-son[root]);
if(f[root]<f[rt]) rt = root;
} void getdis(int root,int fa)
{
if(d[root]<=k) dis[tot++] = d[root];
for(int i=head[root];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(vis[y] || y == fa) continue;
d[y] = d[root] + tree[i].val;
getdis(y,root);
}
} int getcnt(int root,int now)
{
d[root] = now;
tot = ;
getdis(root,);
sort(dis,dis+tot);
int left =,right = tot-,ans=;
while(left<right)
{
if(dis[left]+dis[right]<=k)
{
ans+= right-left;
left++;
}
else right--;
}
return ans;
} void solve(int root)
{
//pf("rt%d\n",rt);
ans+=getcnt(root,);
vis[root] = ;
for(int i=head[root];i!=-;i=tree[i].next)
{
int y = tree[i].y;
if(vis[y]) continue;
ans-=getcnt(y,tree[i].val);
sum = son[y];
rt = ;
getroot(y,rt);
solve(rt);
}
} int main()
{
int i,j,t,kase=;
while(~sf("%d%d",&n,&m),n+m)
{
init();
int x,y,z;
char ch[];
for(i=;i<n;i++)
{
sf("%d%d%d%s",&x,&y,&z,ch);
add(x,y,z);
add(y,x,z);
}
sf("%d",&k);
getroot(,);
solve(rt);
pf("%d\n",ans);
}
return ;
}

以及:http://blog.csdn.net/woshi250hua/article/details/7723400

我看起来是一样的,就是不知道TLE的原因。。

poj 1987 节点距离小于等于K(树DP)的更多相关文章

  1. POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12276   Accepted: 3886 Description ...

  2. poj 1741 两点距离小于K(树DP)

    http://blog.csdn.net/woshi250hua/article/details/7723400 求两点间距离小于等于k的方案数 理一下思路: 求通过点A与另一点连接符合条件的个数 = ...

  3. [51NOD1405] 树的距离之和(树DP)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1405 (1)我们给树规定一个根.假设所有节点编号是0-(n-1 ...

  4. hdu 2196 叶子节点最长距离(树DP)

    http://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html 求每个节点到叶子节点的最长距离 需要保存每个节点到叶子节点距离的最大值和 ...

  5. poj1741 树上距离小于等于k的对数 点分治 入门题

    #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...

  6. 863. All Nodes Distance K in Binary Tree 到制定节点距离为k的节点

    [抄题]: We are given a binary tree (with root node root), a target node, and an integer value K. Retur ...

  7. POJ 1987 BZOJ 3365 Distance Statistics 树的分治(点分治)

    题目大意:(同poj1741,刷一赠一系列) CODE: #include <cstdio> #include <cstring> #include <iostream& ...

  8. 【点分治】【路径小于等于k的条数】【路径恰好等于k是否存在】

    POJ1741:Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 29574   Accepted: 9915 Des ...

  9. Leetcode——863.二叉树中所有距离为 K 的结点

    给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K . 返回到目标结点 target 距离为 K 的所有结点的值的列表. 答案可以以任何顺序返回. 示例 1: 输 ...

随机推荐

  1. 斐波那契数列的Python实现

      斐波那契数列的Python实现:递归实现.非递归实现.斐波那契数列生成器: \[ \begin{equation} F(n)= \begin{cases} n & n=0, 1\\ F(n ...

  2. 多层mvc,thikphp进阶

    程序员,是一种生活态度. 我尽忠恪守,我努力进取,热衷于解决问题,希望得到同样的回报. 我遇到问题,将所有的力量用在解决问题,而不是抱怨,推卸责任上. ------------------------ ...

  3. 我的iphone不能被虚拟机识别怎么办

    我的iphone不能被虚拟机识别怎么办 听语音 | 浏览:3890 | 更新:2015-11-04 15:28 | 标签:iphone vmware ios 1 2 3 4 5 6 分步阅读 特大喜讯 ...

  4. echarts设置地图大小比例,大小设置

    设置地图大小可通过以下属性设置: geo.aspectScale number [ default: 0.75 ] 这个参数用于 scale 地图的长宽比. 最终的 aspect 的计算方式是:geo ...

  5. 第一次接触C++------感触

    2018/09/24 上大学第一次接触C++,感觉还挺有趣的. C语言是计算机的一门语言,顾名思义,语言嘛,有它自己独特的语法. 第一次用C++敲代码,觉得还挺不错的,可以从中找到乐趣.咏梅老师布置的 ...

  6. C++基础学习9:构造函数和析构函数

    1.  构造函数用来对类对象进行初始化,它完成对内存空间的申请.赋初值等工作.  2.  析构函数主要是用来做清理工作的. 补充:函数名或变量名前面有"::"但是没有类名,说明这是 ...

  7. D. Minimum Diameter Tree 思维+猜结论

    D. Minimum Diameter Tree 思维+猜结论 题意 给出一颗树 和一个值v 把该值任意分配到任意边上 使得\(\sum\limits_{i,j}p_{ij}=v\) 使得 这颗树任意 ...

  8. freemarker常用标签解释遍历

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  9. react常用开发工具

    https://www.cnblogs.com/vipstone/p/7125338.html

  10. SQL Server中,varchar和nvarchar如何选择

    正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操作系统并且对中文字体的支持不全面时, 在SQL Server存储中文字符为varchar就会出现乱码(显示为??). ...