poj 1987 节点距离小于等于K(树DP)
这题和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)的更多相关文章
- POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12276 Accepted: 3886 Description ...
- poj 1741 两点距离小于K(树DP)
http://blog.csdn.net/woshi250hua/article/details/7723400 求两点间距离小于等于k的方案数 理一下思路: 求通过点A与另一点连接符合条件的个数 = ...
- [51NOD1405] 树的距离之和(树DP)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1405 (1)我们给树规定一个根.假设所有节点编号是0-(n-1 ...
- hdu 2196 叶子节点最长距离(树DP)
http://www.cnblogs.com/kuangbin/archive/2012/08/28/2659915.html 求每个节点到叶子节点的最长距离 需要保存每个节点到叶子节点距离的最大值和 ...
- poj1741 树上距离小于等于k的对数 点分治 入门题
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...
- 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 ...
- POJ 1987 BZOJ 3365 Distance Statistics 树的分治(点分治)
题目大意:(同poj1741,刷一赠一系列) CODE: #include <cstdio> #include <cstring> #include <iostream& ...
- 【点分治】【路径小于等于k的条数】【路径恰好等于k是否存在】
POJ1741:Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29574 Accepted: 9915 Des ...
- Leetcode——863.二叉树中所有距离为 K 的结点
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K . 返回到目标结点 target 距离为 K 的所有结点的值的列表. 答案可以以任何顺序返回. 示例 1: 输 ...
随机推荐
- Git解决pull无法操作成功
https://blog.csdn.net/chenjunfengf/article/details/78301957 场景 在git pull的时候,如果本地代码有改动,而服务器上代码也已经被其他人 ...
- [SinGuLaRiTy] 分治题目复习
[SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的膨胀 (Expanding ...
- 浅识J2EE十三个规范
前言 没有规矩不成方圆,学习J2EE,先来明白都有什么规范. 内容 1.JDBC(Java Database Connectivity)java数据库连接 a)为java开发人员提供了一个行业标准AP ...
- 博弈论-一堆nim博弈合在一起
今天A了张子苏大神的的题,感觉神清气爽. 一篇对于多层nim博弈讲的很透彻的博文:http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617 我来 ...
- Task4
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 《图解HTTP》阅读笔记--第七章---确保WEB安全的HTTPS
第七章.确保WEB安全的HTTPSHTTP的缺点:通信使用明文(不加密),内容可能会被窃听 解决---加密处理: //将通信加密 :通过SSL(安全套接层)---HTTPS(超文本传输安全协议)--- ...
- Apache 403 错误。。
两个方面.. 一: httpd.conf 是否有 <directory '/www'></directory> 是否有 Deny from all 或者 Require l ...
- Codeforces Round #532 (Div. 2)- C(公式计算)
NN is an experienced internet user and that means he spends a lot of time on the social media. Once ...
- day_10 函数名,闭包,迭代器
1. 函数名的使用 1.函数名是一个变量,函数名储存的是函数的内存地址 2.函数名可以赋值给其他变量 3.函数名可以当容器类对象的元素 4.函数名可以当其他函数的参数 5.函数名可以做函数的返回值 2 ...
- Tomcat-猫
第1章 Tomcat简介 Tomcat 是一个web服务器 ,类似nginx,apache的http Nginx http 只能处理html等静态文件jpg() 网页分为静态网页(以.html 或 ...