这题和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. Spring core注解

    1.@Autowired Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源 Autowired注解来指定自动装配,可以修饰setter方 ...

  2. 《C++标准程序库》-1

    explicit关键字 这个关键字原则上只对构造函数起作用,抑制阴性转换,例如: class String{ String(int size); //本意是要申请size大小的字符串 }; 如果此时调 ...

  3. P3321 [SDOI2015]序列统计 FFT+快速幂+原根

    \(\color{#0066ff}{ 题目描述 }\) 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这 ...

  4. atcoder 2579

    You are taking a computer-based examination. The examination consists of N questions, and the score ...

  5. kuangbin专题十六 KMP&&扩展KMP HDU2087 剪花布条

    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花布条和小 ...

  6. shell脚本学习一

    shell脚本是一种程序与linux内核的语言: 第一个shell脚本: #!/bin/bash echo "cxy" 就是输出cxy 如何执行这个脚本呢: cd demo 进入s ...

  7. Qt 学习之路 2(6):Qt 模块简介

    Home / Qt 学习之路 2 / Qt 学习之路 2(6):Qt 模块简介  豆子  2012年8月26日  Qt 学习之路 2  20条评论 Qt 5 与 Qt 4 最大的一个区别之一是底层架构 ...

  8. FPGA实战操作(1) -- SDRAM(Verilog实现)

    对SDRAM基本概念的介绍以及芯片手册说明,请参考上一篇文章SDRAM操作说明. 1. 说明 如图所示为状态机的简化图示,过程大概可以描述为:SDRAM(IS42S16320D)上电初始化完成后,进入 ...

  9. C语言使用指针表示数组的注意事项

    1)数组名是指针常量 如对指针变量可以进行++运算,但是对数组名却不允许,另外,对数组名的赋值运算也是错误的 2)注意指针变量的当前值 指针变量的值在程序运行过程中可能经常改变,要对此注意 3)数组越 ...

  10. mongodb 基础语法

    参考原文:菜鸟教程 目录 一.数据库二.文档三.索引四.聚合 一.数据库 show dbs -- 查看所有数据库 use DATABASE_NAME -- 如果数据库不存在,则创建数据库,否则切换到指 ...