/*
啊啊啊啊啊啊啊本题证明一个问题,在实际应用中sort比qsort块
还有memset这类初始化能不加尽量别加,很浪费时间
原来的程序把qsort该成sort,去掉一个无用memset就a了时间不到一半
题意:和poj1741差不多,不过本题求的是dis[i]+dis[j]==dis[k];
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 11000
#define inf 0x3fffffff
struct node {
int u,v,w,next;
}bian[N*4];
int yong,head[N];
void init() {
yong=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
int minn,ma,vis[N],diss[N],len,num[N],nn;
void dfs1(int u,int fa) {
int i;
nn++;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(v!=fa&&!vis[v])
dfs1(v,u);
}
return ;
}
int Max(int v,int vv) {
return v>vv?v:vv;
}
void dfs2(int u,int fa) {
num[u]=1;
int i,tit=0;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(v!=fa&&!vis[v]) {
dfs2(v,u);
num[u]+=num[v];
tit=Max(tit,num[v]);
}
}
tit=Max(tit,nn-num[u]);
if(tit<minn) {
minn=tit;
ma=u;
}
return ;
}
void dfs4(int u,int fa,int w) {
int i;
diss[len++]=w;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(v!=fa&&!vis[v])
dfs4(v,u,w+bian[i].w);
}
return ;
}
int m;
int dfs3(int u,int fa,int w) {
len=0;
dfs4(u,fa,w);
sort(diss,diss+len);
int i,j,ans=0,k;
for(i=0,j=len-1;i<j;i++) {//1000ms
while(i<j&&diss[i]+diss[j]>m)
j--;
k=j;
while(i<k&&diss[i]+diss[k]==m) {
k--;
ans++;
}
}
/*
i=0;j=len-1;
while(i<j) {//688ms
if(diss[i]+diss[j]<m)
i++;
else
if(diss[i]+diss[j]>m)
j--;
else {
if(diss[i]==diss[j]) {
ans+=(j-i+1)*(j-i)/2;
break;
}
ki=i;kj=j;
while(diss[i]==diss[ki])ki++;
while(diss[j]==diss[kj])kj--;
ans+=(ki-i)*(j-kj);
i=ki;j=kj;
}
}
*/
return ans;
}
int dfs(int u) {
minn=inf;
nn=0;
dfs1(u,-1);
dfs2(u,-1);
int ans=dfs3(ma,-1,0);
// printf("%d\n",ma);
vis[ma]=1;
int i;
for(i=head[ma];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(!vis[v]) {
ans-=dfs3(v,-1,bian[i].w);
ans+=dfs(v);
}
}
return ans;
}
int main() {
int n,i,j,k;
while(scanf("%d",&n),n) {
init();
for(i=1;i<=n;i++) {
while(scanf("%d",&j),j) {
scanf("%d",&k);
addedge(i,j,k);
addedge(j,i,k);
}
}
while(scanf("%d",&m),m) {
memset(vis,0,sizeof(vis));
k=dfs(1);
if(k)
printf("AYE\n");
else
printf("NAY\n");
}
printf(".\n");
}
return 0;
}

poj 2114 树的分治 可作模板的更多相关文章

  1. poj 1741 树的分治

    思路:这题我是看 漆子超<分治算法在树的路径问题中的应用>写的. 附代码: #include<iostream> #include<cstring> #includ ...

  2. Poj 2114 Boatherds(点分治)

    Boatherds Time Limit: 2000MS Memory Limit: 65536K Description Boatherds Inc. is a sailing company op ...

  3. POJ 2114 (点分治)

    题目:https://vjudge.net/contest/307753#problem/B 题意:求树中路径和=k的点对是否存在 思路:点分治,这个题其实和上一题洛谷一样,只是这个数据强,我们不能直 ...

  4. poj 1987 树的分治

    思路:1741的A1送 1. #include<iostream> #include<cstring> #include<algorithm> #include&l ...

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

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

  6. POJ 1741 Tree 树的分治

    原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...

  7. POJ - 1741 - Tree - 点分治 模板

    POJ-1741 题意: 对于带权的一棵树,求树中距离不超过k的点的对数. 思路: 点分治的裸题. 将这棵树分成很多小的树,分治求解. #include <algorithm> #incl ...

  8. poj3468(线段树区间更新&区间求和模板)

    题目链接: http://poj.org/problem?id=3468 题意: 输入 n, m表初始有 n 个数, 接下来 m 行输入, Q x y 表示询问区间 [x, y]的和: C x y z ...

  9. [poj1741][tree] (树/点分治)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

随机推荐

  1. bzoj 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场【bfs】

    不是严格小于是小于等于啊!!!!!不是严格小于是小于等于啊!!!!!不是严格小于是小于等于啊!!!!! 是我看不懂人话还是翻译不说人话= = 把所有格子按值排个序,bfs扩展打标记即可 #includ ...

  2. 清北考前刷题day6早安

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...

  3. 靶形数独 2009年NOIP全国联赛提高组(搜索)

    靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小城和小华都是热爱数 ...

  4. DHTML_____window对象方法

    <html> <head> <meta charset="utf-8"> <title>window对象方法</title&g ...

  5. 在控制台中输出 ASP.NET 网站的跟踪信息

    实现方法: 1. 可以在 C# 代码中调用 System.Diagnostics.Debug.WriteLine() 来实现. 其效果类似于在控制台应用程序中调用 Console.WriteLine( ...

  6. 全面学习ORACLE Scheduler特性(12)使用Windows和Window Groups

    七.使用Windows 此Windows非彼Windows,通常说的Windows是指盖首富的操作系统,而此处所说的Windows,是指SCHEDULER特性中的一个子项.在SCHEDULER中,WI ...

  7. EasyUI tree 异步树与采用扁平化实现的同步树

    所谓好记性不如烂笔头,为了以防忘记,才写下这篇博客,废话不多.. 异步树: tips:   可以采用easyui里的原始数据格式,也可以采用扁平化的数据格式. 使用场景: 当菜单模块数量庞大或者无限极 ...

  8. LR接口测试---基于http协议之get/post

    get请求代码: //=====================get interface======================== 以http状态码方式: //获取返回的HTTP状态码判断请求 ...

  9. activity间数据传递

    传递简单数据 创建两个activity,FirstActivity和TwoActivity,这里将会将数据从FisrtActivity传给TwoActivity. 创建完activity的目录界面如下 ...

  10. Tornado引入静态css、js文件

    一.静态路径 template_path=os.path.join(os.path.dirname(__file__), "templates") 这里是设置了模板的路径,放置模板 ...