算法学习分析-点分治 HDU 6269 Master of Subgraph
首先给出定义
点分治是一种处理树上路径的工具
挂出一道题目来:Master of Subgraph
这道题目让你求所有联通子图加和所能产生数字,问你1到m之间,那些数字可以被产生
这道题目,假如我们利用暴力的方法去求解的话
实际上是对每个节点进行一次dfs,这样的话会发现复杂度为O(N^2)也就是再9e6左右,再加上常数M/64,复杂度根本不够(9e9)
我们可以利用点分治去优化复杂度
点分治的原理就是树上的路径产生的答案,不是在经过这个节点的就是在不经过这个节点的,那我们找到树的重心的话,就能够算出来经过该点的所有答案,然后依次递归大约logN层,这样复杂度就变成了NlogN的程度,也就是3e4*1e3=3e7加上常数,再加上时间的宽限,完全够用
所以点分治就是树上分治的一种,减小重复计算的东西,不断逐步缩小子树的计算
其中一般来说要开 一个父节点数组,一个儿子数数组,来计算重心的位置
然后就是点分治,跟递归差不多就是要去计算答案
然后就是利用solve函数,每次点分治计算树根,然后依次处理子树的重心节点然后继续递归继续分治
#include <iostream>
#include <cstring>
#include <vector>
#include <bitset>
;
;
int E[MAXN][MAXN];
int all[MAXN];
int f[MAXN],son[MAXN],root,tot;
/*
分别代表f[x]的两侧孩子数目的最大值,重心的孩子数目最小
son代表以x为根的孩子数目
root是被移动的根
tot是当前根的孩子总数
*/
bool vis[MAXN];
std::bitset<MAXM>b[MAXN],ans;
int n,m,val[MAXN];
void dfs(int x,int fa){
/* dfs搜索树,将根移动到树的重心,降低dp层数 */
f[x] = ;
/* 标记孩子数目为0 */
son[x] = ;
/* 计算孩子数目 */
; i <= all[x]; i++)
{
int y=E[x][i];
if(!vis[y] && y!=fa)
{
dfs(y,x);
/* 递归进入子数 */
f[x] = std::max(f[x],son[y]);
/* 计算子树中孩子数目最多的子树孩子数 */
son[x]+=son[y];
/* 累加孩子数目 */
}
}
f[x]=std::max(f[x],tot-f[x]);
/* 计算该根节点最大孩子数其余侧的数目中两边的最大值 */
if(f[x]<f[root]) root=x;
/* 移动根节点,寻找重心 */
}
void getdp(int x, int fa){
b[x]<<=val[x];
/* 累加val[x] */
son[x]=;
;i<=all[x];i++)
{
int y=E[x][i];
if(!vis[y] && y!=fa)
{
b[y]=b[x];
getdp(y,x);
son[x]+=son[y];
b[x]|=b[y];
}
}
}
void solve(int x){
vis[x] = true;
b[x] = ;
getdp(x,);
/* 以某一点为根进行点分治 */
ans|=b[x];
/* 累加答案 */
;i<=all[x];i++)
{
/* 子树递归进行点分治 */
int y=E[x][i];
if(!vis[y])
{
tot = son[y];
root = ;
dfs(y,x);
/* 先寻找树根 */
solve(root);
/* 递归分治 */
}
}
}
int main(){
int T;
std::cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
;i<=n;i++) all[i]=;
ans.reset();
memset(vis,,sizeof(vis));
;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
E[x][++all[x]]=y;
E[y][++all[y]]=x;
}
;i<=n;i++)
{
scanf("%d",&val[i]);
}
f[] = n+;
tot=n;
dfs(,root);
solve(root);
;i<=m;i++)
{
printf("%d",(int)ans[i]);
}
puts("");
}
;
}
算法学习分析-点分治 HDU 6269 Master of Subgraph的更多相关文章
- HDU 6268 Master of Subgraph (2017 CCPC 杭州 E题,树分治 + 树上背包)
题目链接 2017 CCPC Hangzhou Problem E 题意 给定一棵树,每个点有一个权值,现在我们可以选一些连通的点,并且把这点选出来的点的权值相加,得到一个和. 求$[1, m] ...
- hdu 6268 Master of Subgraph(点分治+bitset)
You are given a tree with n nodes. The weight of the i-th node is wi. Given a positive integer m, no ...
- <2014 05 09> Lucida:我的算法学习之路
[转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...
- 算法学习之C语言基础
算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- 算法学习之快速排序的C语言实现
近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...
- 3.2_k-近邻算法案例分析
k-近邻算法案例分析 本案例使用最著名的”鸢尾“数据集,该数据集曾经被Fisher用在经典论文中,目前作为教科书般的数据样本预存在Scikit-learn的工具包中. 读入Iris数据集细节资 ...
- Reinforcement Learning Q-learning 算法学习-2
在阅读了Q-learning 算法学习-1文章之后. 我分析了这个算法的本质. 算法本质个人分析. 1.算法的初始状态是随机的,所以每个初始状态都是随机的,所以每个初始状态出现的概率都一样的.如果训练 ...
随机推荐
- 【二叉树的递归】01二叉树的最小深度【Minimum Depth of Binary Tree】
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,找出他的最小的深度 ...
- cmd cvf war包
1.进入要打包的目录下 --> cmd d: cd \路径 jar -cvf 包名.war * 2.解压 进入需要解压的目录 cd /depa123/webapps/css jar -xvf / ...
- 【LeetCode】024. Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...
- python setuptools安装
执行# python setup.py install 时发生如下错误 Traceback (most recent call last): File "setup.py", li ...
- 第二次C语言实验报告
#一.设计题目,设计思路,实现方法 ##设计题目 15-10 找最长的字符串,14-5 指定位置输出字符串,13-6 数组循环右移,12-5 查找指定字符,11-5 打印杨辉三角. ##设计思路 15 ...
- boost::io_service解读
boost::io_service解读 asio是boost提供的一个c++异步编程模型库,其核心类io_service,在多线程编程里面提供了任务队列和任务分发功能,在socket.io编程里主要作 ...
- QT4.8.5+qt-vs-addin-1.1.11+VS2010安装配置和QT工程的新建和加载
1.下载windows下的QT库 QT4.8.5 for vs2010: http://download.qt-project.org/official_releases/qt/4.8/4.8.5/q ...
- CentOS 配置RDP
XRDP服务器 CentOS安装XRDP实现远程桌面访问: 由于安装的是远程桌面,因此需要安装桌面显示服务:# yum install vnc-server 下面开始配置XRDP服务 l 配置环境: ...
- 数据库高手(DBA专家 ,SSIS,replacation ,tourble shooting)
http://www.cnblogs.com/qanholas/category/266780.html 随笔分类 - mssql SQL Server 2008 Datetime Cast 成 Da ...
- LAMP 1.7Apache用户认证
假如我们要在www.aaa.com/的 abc/目录下放一些文件,只想让自己访问,做一个用户认证.输入正确的用户和密码才能访问 cd /data/www mkdir abc cd abc cp /et ...