poj 2114 树的分治 可作模板
/*
啊啊啊啊啊啊啊本题证明一个问题,在实际应用中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 树的分治 可作模板的更多相关文章
- poj 1741 树的分治
思路:这题我是看 漆子超<分治算法在树的路径问题中的应用>写的. 附代码: #include<iostream> #include<cstring> #includ ...
- Poj 2114 Boatherds(点分治)
Boatherds Time Limit: 2000MS Memory Limit: 65536K Description Boatherds Inc. is a sailing company op ...
- POJ 2114 (点分治)
题目:https://vjudge.net/contest/307753#problem/B 题意:求树中路径和=k的点对是否存在 思路:点分治,这个题其实和上一题洛谷一样,只是这个数据强,我们不能直 ...
- poj 1987 树的分治
思路:1741的A1送 1. #include<iostream> #include<cstring> #include<algorithm> #include&l ...
- poj 1741 树的点分治(入门)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 18205 Accepted: 5951 Description ...
- POJ 1741 Tree 树的分治
原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...
- POJ - 1741 - Tree - 点分治 模板
POJ-1741 题意: 对于带权的一棵树,求树中距离不超过k的点的对数. 思路: 点分治的裸题. 将这棵树分成很多小的树,分治求解. #include <algorithm> #incl ...
- poj3468(线段树区间更新&区间求和模板)
题目链接: http://poj.org/problem?id=3468 题意: 输入 n, m表初始有 n 个数, 接下来 m 行输入, Q x y 表示询问区间 [x, y]的和: C x y z ...
- [poj1741][tree] (树/点分治)
Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...
随机推荐
- PKUACM 2018 D chocolate【并查集+克鲁斯卡尔】
传送:http://poj.openjudge.cn/practice/C18D/ 依然是课件截图 #include<iostream> #include<cstdio> #i ...
- VUE中全局变量的定义和使用
目录 VUE中全局变量的定义和使用 1.工作中遇到的两类问题 1.1 状态值(标志) 1.2 传递字段 2.解决方法 2.1 VUEX 2.2 使用全局变量法管理状态与字段值 3.具体实现 3.1创建 ...
- eslint 的配置
安装 可以全局安装,也可以在项目下面安装. 如下是在项目中安装示例,只需要在 package.json 中添加如下配置,并进行安装: >"eslint": "^4. ...
- 403 Frog Jump 青蛙过河
一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中.给定石子的位置列表(用单元格序号升序表示), 请判定 ...
- selenium + python实现截图并且保存图片
webdriver的截图功能十分强悍,无论页面多长,webdriver都能比较完美的截到完整的页面. python代码: # -*- coding: utf-8 -*-from selenium im ...
- [转]mysql常用函数
转自:http://sjolzy.cn/Common-functions-mysql.html 控制流函数 IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回ex ...
- C# 调用非托管函数
C#通过DllImport可以直接调用Windows中的一些功能.C++中已经编写好的一些方法: DllImport所在的名字空间:System.Runtime.InteropServices; Dl ...
- HTML+CSS 基础布局(案列一)
刚html刚讲完马上就接着css,周末的任务就是高仿案例,结果有点遭 图文布局 代码 css(内部样式) html <!DOCTYPE html><html><head& ...
- jboss之启动加载过程详解
今天看了看jboss的boot.log和server.log日志,结合自己的理解和其他的资料,现对jboss的启动和加载过程做出如下总结: boot.xml是服务器的启动过程的日志,不涉及后续的操作过 ...
- jstree -- 使用JSON 数据组装成树
概述: 前面主要是html数据,这里主要是json数组 1.格式 jsTree需要一个具体格式JSON数据,在标准的语法没有那个字段是必须的-而是那些是你需要的.请记住你可以获取任何你请求的其他属性, ...