poj 2114 Boatherds 树的分治
还是利用点的分治的办法来做,统计的办法不一样了,我的做法是排序并且标记每个点属于哪颗子树。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e4+9;
int head[maxn],lon,n,mm,m;
struct
{
int next,to,w;
}e[maxn<<1];
void edgeini()
{
memset(head,-1,sizeof(head));
lon=0;
}
void edgemake(int from,int to,int w)
{
e[++lon].to=to;
e[lon].w=w;
e[lon].next=head[from];
head[from]=lon;
} int son[maxn],maxson[maxn];
bool use[maxn];
int dp(int t,int from)
{
int ans,tmp,now=1e4+9;
son[t]=maxson[t]=0;
for(int k=head[t];k!=-1;k=e[k].next)
{
int u=e[k].to;
if(u==from||use[u]) continue;
tmp=dp(u,t);
if(maxson[tmp]<now)
{
now=maxson[tmp];
ans=tmp;
}
son[t]+=son[u];
maxson[t]=max(son[u],maxson[t]);
}
son[t]++;
maxson[t]=max(maxson[t],mm-son[t]);
if(maxson[t]<now) ans=t;
return ans;
}
int d[maxn],top;
struct D
{
int data,ss;
bool operator <(const D & xx) const
{
return data<xx.data;
}
}a[maxn];
void dfs(int t,int from)
{
a[++top].data=d[t];
son[t]=0;
for(int k=head[t];k!=-1;k=e[k].next)
{
int u=e[k].to;
if(u==from||use[u]) continue;
d[u]=d[t]+e[k].w;
dfs(u,t);
son[t]+=son[u];
}
son[t]++;
} int ss[maxn];
int cal(int l,int r)
{
int ret=0;
for(;l<r;)
{
while(r>l&&a[l].data+a[r].data>m) r--;
while(r>l&&a[l].data+a[r].data<m) l++;
if(a[l].data+a[r].data==m)
{
int ll=a[l].ss,rr=a[r].ss;
if(ll!=rr) return true;
while(l<r&&a[l+1].data==a[l].data)
{
if(a[l+1].ss!=ll) return true;
l++;
}
while(l<r&&a[r-1].data==a[r].data)
{
if(a[r-1].ss!=rr) return true;
r--;
}
l++;
r--;
}
}
return false;
} bool solve(int t)
{
int now=dp(t,0);
use[now]=1;
d[now]=top=0;
dfs(now,0);
int tmp=2,con=0;
for(int k=head[now];k!=-1;k=e[k].next)
{
int u=e[k].to;
if(use[u]) continue;
con++;
for(int i=tmp;i<tmp+son[u];i++)
a[i].ss=con;
tmp+=son[u];
}
sort(a+1,a+tmp);
a[1].ss=0;
int ret=cal(1,tmp-1);
if(ret) return true;
for(int k=head[now];k!=-1;k=e[k].next)
{
int u=e[k].to;
if(use[u]) continue;
mm=son[u];
if(solve(u)) return true;
}
return false;
} int main()
{
// freopen("in.txt","r",stdin);
while(scanf("%d", &n)!=EOF&& n)
{
edgeini();
for(int i=1,to,w;i<=n;i++)
{
while(scanf("%d",&to),to)
{
scanf("%d",&w);
edgemake(i,to,w);
edgemake(to,i,w);
}
}
int tmp;
while(scanf("%d",&tmp)!=EOF&&tmp)
{
m=tmp;
mm=n;
memset(use,0,sizeof(use));
if(solve(1))
printf("AYE\n");
else
printf("NAY\n");
}
printf(".\n");
}
return 0;
}
poj 2114 Boatherds 树的分治的更多相关文章
- POJ 2114 Boatherds 树分治
Boatherds Description Boatherds Inc. is a sailing company operating in the country of Trabantust ...
- POJ 1741 Tree 树的分治
原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...
- poj 2114 Boatherds (树分治)
链接:http://poj.org/problem?id=2114 题意: 求树上距离为k的点对数量: 思路: 点分治.. 实现代码: #include<iostream> #includ ...
- POJ 2114 Boatherds【Tree,点分治】
求一棵树上是否存在路径长度为K的点对. POJ 1714求得是路径权值<=K的路径条数,这题只需要更改一下统计路径条数的函数即可,如果最终的路径条数大于零,则说明存在这样的路径. 刚开始我以为只 ...
- Poj 2114 Boatherds(点分治)
Boatherds Time Limit: 2000MS Memory Limit: 65536K Description Boatherds Inc. is a sailing company op ...
- POJ 2114 Boatherds 划分树
标题效果:鉴于一棵树,问有两点之间没有距离是k的. 数据的多组 思维:和IOI2011的Race喜欢.不是这么简单.阅读恶心,我是在主要功能的别人的在线副本. CODE: #include <c ...
- POJ 2114 - Boatherds
原题地址:http://poj.org/problem?id=2114 题目大意: 给定一棵点数为\(n~(n \le 10000)\)的无根树,路径上有权值,给出m组询问($m \le 100$), ...
- POJ 1741 Tree 树的分治(点分治)
题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中 ...
- poj 1741 Tree (树的分治)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 30928 Accepted: 10351 Descriptio ...
随机推荐
- VC编程之设置客户区背景图片
在很多系统中出于美观的需要常常要设置背景图片.下面我介绍一种在客户区设置背景图片的简单方法. 1 .将背景bmp 图片导入到工程,资源ID 这里假设为 IDB_BITMAP1 2 .在视图类添加如下代 ...
- HDU 2962 Trucking
题目大意:给定无向图,每一条路上都有限重,求能到达目的地的最大限重,同时算出其最短路. 题解:由于有限重,所以二分检索,将二分的值代入最短路中,不断保存和更新即可. #include <cstd ...
- centos6.5 搭建php5.5+mysql5.5+apache2.4
本文总结了Linux下 root.常用查找命令.卸载软件方法(见二.安装PHP5.5).配置软件源(见二).安装软件(见二)与高版本替换软件(见三.安装MySQL)的方法. 迁移网站,机器上原本已有p ...
- linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其它g++版本号未知)
一.描写叙述 眼下已经linux64位系统中g++4.4.7下发现了该bug.其它的版本号还未測试. 经測试,假设传入wcsncpy函数第一个參数(即目标缓冲区)的地址不能被4整除的话就必然会发生段错 ...
- hql中不能写count(1)能够写count(a.id)
hql中不能写count(1)能够写count(a.id)里面写详细的属性 String hql="select new com.haiyisoft.vo.entity.cc.repo.Bu ...
- 对象图(Object Diagram)—UML图(三)
一.用一张图来介绍一下对象图的基本内容 二.对象图与类图的基本差别 三.对象图实例
- CF-192-diy-2
题目链接: http://codeforces.com/contest/330 A. Cakeminator 题目意思: 给一个r*c的矩阵方格,有些位置有S,如果某一行和一列都不含标记为S的方格,则 ...
- SDWebImage 常用方法
SDWebImage是iOS中一款处理图片的框架, 使用它提供的方法, 一句话就能让UIImageView自动去加载并显示网络图片.特别是在UITableViewCell中有UIImageView需要 ...
- 在Outlook中设置QQ邮箱
原本以为在Outlook中设置QQ邮箱没多大难度,但我错了,估计错了腾讯的麻烦程度,故记录下来. ----- 打开Outlook 2013(Outlook 2010也差不多),若是第一次打开会提示你设 ...
- read/write拥塞与非拥塞
read/write read函数从打开的设备或文件中读取数据. #include <unistd.h> ssize_t read(int fd, void *buf, size_t co ...