/*
啊啊啊啊啊啊啊本题证明一个问题,在实际应用中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. SP2916 GSS5 - Can you answer these queries V

    给定一个序列.查询左端点在$[x_1, y_1]$之间,且右端点在$[x_2, y_2]$之间的最大子段和,数据保证$x_1\leq x_2,y_1\leq y_2$,但是不保证端点所在的区间不重合 ...

  2. 关于mybatis的xml文件中使用 >= 或者 <= 号报错的解决方案

    当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...

  3. MVC学习-用EF做增删改查

    在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...

  4. SpringBoot 2.x (1):手动创建项目与自动创建项目

    SpringBoot 2.x基于Spring Framework 5.x 环境需求如下: JDK1.8或以上 Maven3.2或以上 这里我使用的是Eclipse,IDEA这个工具很强大,但不习惯它 ...

  5. Android 将Bitmap对象保存为png图片文件

    输入:Bitmap对象.保存的路径.保存的文件名 注意路径的最后要带上  '/' 符号 private void saveBitmap(Bitmap bitmap,String path, Strin ...

  6. vuex与redux,我们都一样

    vuex与redux的主要区别: redux:生成的全局数据流是通过每个组件的props逐层传递到各个子组件的,通过@connect装饰器绑定在this.props上面. vuex :生成的全局数据则 ...

  7. 了解固态硬盘SSD,竟然如此简单!小白也能懂!

    https://www.youtube.com/watch?v=alb6-zp52mA

  8. 总结struts2 iterator status的用法

    1:#status.odd 是否奇数行 2:#status.count 当前行数 3:#status.index 当前行的序号,从0开始『#status.count=#status.index+1』 ...

  9. 操作Session存储对象时的一些问题

    前段时间在操作Session存储的对象时,遇到了类似以下的这种情况: User user=new User("张三"); //创建一个姓名为“张三”的User对象 Session[ ...

  10. 在vmware中 centos7安装gooderp

    环境为windows 10系统,vmware 12,centos 7.4.centos安装了gnome桌面,用里面的终端来安装,自带的firefox浏览器. 增加用户 首先要新建一个用户来管理good ...