poj2114 寻找树上存在长度为k点对,树上的分治
寻找树上存在长度为k点对,树上的分治 代码和 这个 差不多 ,改一下判断的就好
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <string.h>
using namespace std;
const int maxn=;
int H[maxn],nx[maxn*],to[maxn*],numofE,dist[maxn*];
void add(int u,int v, int d)
{
numofE++;
dist[numofE]=d;
to[numofE]=v;
nx[numofE]=H[u];
H[u]=numofE;
}
void init(int N){
numofE=;
memset(H,,sizeof(H));
}
int ans;
int subnum[maxn],Q[maxn+],fa[maxn];
bool center[maxn];
int N,K;
int searchroot(int cur)
{
int rear=,root=cur;
Q[rear++]=cur;fa[cur]=;
for(int i=; i<rear; i++)
{
int x=Q[i];
for(int j=H[x]; j; j=nx[j])
if(to[j]!=fa[x]&¢er[to[j]]==false)
Q[rear++]=to[j],fa[to[j]]=x;
}
int MIN=maxn;
for(int i=rear-; i>=; i--)
{
int x=Q[i];
subnum[x]=;
int MA=;
for(int j=H[x]; j ; j=nx[j])
if(to[j]!=fa[x]&¢er[to[j]]==false)
MA=max(MA,subnum[to[j]]),subnum[ x ]+=subnum[ to[j] ];
MA=max(MA,rear-subnum[x]);
if(MIN>MA)MIN=MA,root=x;
}
return root;
}
int P[maxn];
int count_pair(int s, int t)
{
int ge=,l=t,r=t;
for(int i=s; i<t; i++)
{
while(r>s&&P[i]+P[r-]>K)r--;
while(l>s&&P[i]+P[l-]>=K)l--;
if(i>=l&&i<r)ge+=r-l-;
else ge+=r-l;
}
return ge/;
}
void updateedg(int s, int cur, int d)
{
int rear=;
Q[rear++]=cur;fa[cur]=;P[s]=d;
for(int i=; i<rear; i++)
{
int x=Q[i];
for(int j=H[x];j; j=nx[j])
{
int tto=to[j];
if(center[tto]||tto==fa[x])continue;
P[s+rear]=P[s+i]+dist[j],Q[rear++]=tto,fa[tto]=x;
}
}
sort(P+s,P+s+rear);
}
int dfs(int s, int cur, int d)
{
int root,tot=;
root=searchroot(cur);
center[root]=true;
for(int i=H[root]; i ;i=nx[i])
{
int tto=to[i];
if(center[tto])continue;
int n=dfs(s+tot,tto,dist[i]);
if(ans>){
center[root]=false;return ;
}
ans-=count_pair(s+tot,s+tot+n);
tot+=n;
}
P[s]=;
sort(P+s,P+s+tot);
ans+=count_pair(s,s+tot);
if(ans>){
center[root]=false;return ;
}
center[root]=false;
updateedg(s,cur,d);
return tot;
}
int main()
{
for(;;)
{
scanf("%d",&N); if(N==)break;
init(N);
for(int i=;i<=N; i++)
{ int d;
for(;;)
{
scanf("%d",&d); if(d==)break;
int c; scanf("%d",&c);
add(i,d,c);add(d,i,c);
}
}
for(;;)
{
scanf("%d",&K);if(K==)break;
ans=;
dfs(,,);
if(ans>)
puts("AYE");
else puts("NAY");
}
puts(".");
}
return ;
}
/*
6
2 1 3 1 4 1 0
0
5 1 6 1 0
0
0
0
2
*/
poj2114 寻找树上存在长度为k点对,树上的分治的更多相关文章
- 寻找数组中的第K大的元素,多种解法以及分析
遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...
- 寻找链表的倒数第k个节点
寻找链表的倒数第k个节点 题目:已知一个带有表头结点的单链表,节点结构为(data,next),假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个 ...
- CSU 1660 K-Cycle(dfs判断无向图中是否存在长度为K的环)
题意:给你一个无向图,判断是否存在长度为K的环. 思路:dfs遍历以每一个点为起点是否存在长度为k的环.dfs(now,last,step)中的now表示当前点,last表示上一个访问的 点,step ...
- 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length
// 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...
- leetcode-219-Contains Duplicate II(使用set来判断长度为k+1的闭区间中有没有重复元素)
题目描述: Given an array of integers and an integer k, find out whether there are two distinct indices i ...
- hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机
题目传送门 题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出. 思路: 这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小. 我们以$aabab$ ...
- 树形DP 统计树中长度为K的路径数量——Distance in Tree
一.问题描述 给出一棵n个节点的树,统计树中长度为k的路径的条数(1<=n<=50000 , 1<=k<=500). 二.解题思路 设d[i][k]表示以i为根节点长度为k的路 ...
- 基于邻接表的长度为k的简单路径的求解
描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...
- 【LeetCode】1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 Check If a String Contains All Binary Codes of Size K
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计长度为 K 的子串个数 日期 题目地址:https ...
随机推荐
- jmeter发送https请求
- linux read()和write
参考http://www.cnblogs.com/xiehongfeng100/p/4619451.html 1. read总是在接收缓冲区有数据时立即返回,而不是等到给定的read buffer填满 ...
- javascript面向对象中继承实现?
面向对象的基本特征有:封闭.继承.多态. 在javascript中实现继承的方法: 1.原型链(prototype chaining) 2.call()/apply() 3.混合方式(prototyp ...
- 第8章 用SQL语句操作数据
SQL的组成: (1)DML(Data Manipiation Language ,数据操作语言,)用来插入,修改和删除数据库中的数据,如:INSERT,UPDATE,DELETE等. (2)DDL( ...
- 1-1-linux环境搭建
1-1-linux环境搭建 1.安装虚拟机 (1).安装虚拟机增强工具. (2).创建共享文件夹:(https://www.cnblogs.com/huangjianxin/p/6343881.htm ...
- 记录关于vs2008 和vs2015 的报错问题
出现了 VS2008无法创建项目,无法打开项目的情况,提示这个注册表键值有问题 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSBuild \ ToolsV ...
- Python-Log-note.md
#LOG - https://www.cnblogs.com/yyds/p/6901864.html - logging - logging模块提供模块级别的函数记录日志 - 包括四大组件 ## 1. ...
- jquery小结收藏
//根据id获取控件的值,如果没有数据默认赋值为0 function getDataById(id) { var data = $("#"+id).val(); if(data== ...
- 前端MD5加密【单向加密】
密码存储的方式: 密码该如何存储呢?按照安全性由低到高,有这样几种选择: 1.密码名文直接存储在系统中 2.密码经过对称加密后再存储 3.密码经过非对称加密后再存储 步骤: 1.用户端:用户提交用户名 ...
- 安装python sklearn经验总结
1. 需要安装 numpy, scipy, 和sklearn和ipython,Cython sklearn,ipython, Cython都可以通过pip来安装.但scipy,可能还有numpy必须通 ...