dfs序与求子树子节点(染了色)的个数
https://blog.csdn.net/hpu2022/article/details/81910490
https://blog.csdn.net/qq_39670434/article/details/78425125
https://www.cnblogs.com/gj-Acit/p/3236843.html
https://blog.csdn.net/iamzky/article/details/18923587
void dfs(int u) {
in[u] = ans;
for(int i = ; i < edge[u].size(); i++) {
ans++;
dfs(edge[u][i]);
}
out[u] = ans;
}
https://vjudge.net/contest/230809#status/xiayuyang/I/0/
https://cn.vjudge.net/contest/209473#problem/D
该题给出前n个节点有多少个子节点,然后要很多次查询,看是否为父子关系。
用dfs序做,如果in[x] < in[y] && out[x] > out[y] 则x是y的父节点。用栈模拟来标记每个节点的in于out值。
https://www.cnblogs.com/zyb993963526/p/7301444.html
https://www.cnblogs.com/L-Excalibur/p/8511527.html#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn=+; int n, m;
int start[maxn];
int c[maxn];
int in[maxn];
int out[maxn]; void dfs(int u)
{
stack<int> S;
int dfs_clock=;
in[u]=;
S.push(u);
while(!S.empty())
{
int x=S.top();
if(in[x])
{
out[x]=++dfs_clock;
S.pop();
continue;
//out值,标记玩就要pop该点。
}
in[x]=++dfs_clock;
for(int i=start[x];i<start[x]+c[x];i++)
{
if(i<n) {in[i]=;S.push(i);}
else {in[i]=++dfs_clock;out[i]=++dfs_clock;}
//如果小于n则把该点push进去,相当于bfs,然后标记in值,如果大于n则进去就出来所以可以直接标号
}
}
} int main()
{
//freopen("in.txt","r",stdin);
int T; int kase=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int s=;
for(int i=;i<n;i++)
{
scanf("%d",&c[i]);
start[i]=s; s+=c[i];
}
dfs();
printf("Case %d:\n",++kase);
int q;
scanf("%d",&q);
while(q--)
{
int u,v;
scanf("%d%d",&u,&v);
if(in[u]<in[v] && out[u]>in[v]) puts("Yes");
else puts("No");
}
if(T) puts("");
}
return ;
}
/* by Lstg */
/* 2018-03-05 21:02:03 */ #include<stdio.h>
#include<iostream>
#include<queue>
#define MAXN 20000005
using namespace std; int dfn[MAXN],dfm[MAXN],stk[MAXN],n;
queue<int>g[];//这里太大就会RE void _mydfs(int x){ int top=,num=,y;
dfn[x]=num++;
stk[++top]=x;
while(top){
x=stk[top];
if(x>n||g[x].empty()){/*先判断x的大小防RE和WA(有时溢出不会告诉你是RE,而会返回WA)*/
dfm[x]=num++;
top--;
}
else{
y=g[x].front();
g[x].pop();
dfn[y]=num++;
stk[++top]=y;
}
}
} int main(){ int T,tot,i,x,y;
scanf("%d",&T);
for(int cc=;cc<=T;cc++){
scanf("%d",&n);
tot=; for(i=;i<n;i++){
while(!g[i].empty())g[i].pop();
scanf("%d",&x);
while(x--)
g[i].push(++tot);
}
_mydfs();
printf("Case %d:\n",cc);
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%d%d",&x,&y);
if(dfn[x]<dfn[y]&&dfm[x]>dfm[y])
puts("Yes");
else puts("No");
}
if(cc!=T)putchar();
}
return ;
}
https://vjudge.net/contest/218179#problem/Q 求子树大小(染色的)
https://blog.csdn.net/baidu_19306071/article/details/52005557
#include <bits/stdc++.h> using namespace std;
const int maxm = 2e5 + ;
const int maxn = 2e5 + ;
typedef long long ll;
struct Edges{
int u,v;
}edge[maxm];
vector<int> G[maxn]; int cnt[maxn];
int dfs(int cur,int from){
for(int i = ; i < G[cur].size() ; i ++){
int v = G[cur][i];
if(v == from) continue;
cnt[cur] += dfs(v,cur);
}
return cnt[cur];
} int main (){
int n,k;
scanf("%d %d", &n,&k);
for(int i = ; i <= k* ; i ++){
int tmp;
scanf("%d", &tmp);
cnt[tmp] = ;
}
int cn = ;
for(int i = ; i < n- ; i ++){
int u,v;
scanf("%d %d", &u,&v);
edge[i].u = u;
edge[i].v = v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(,-);
ll exp = ;
for(int i = ; i < n- ; i ++){
Edges & e = edge[i];
int tt = min(cnt[e.u],cnt[e.v]);
int tmp = min(*k-tt,tt);
exp += tmp;
}
printf("%lld\n",exp);
}
dfs序与求子树子节点(染了色)的个数的更多相关文章
- dfs序+RMQ求LCA详解
首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq ...
- Codeforces - 570D 离散DFS序 特殊的子树统计 (暴力出奇迹)
题意:给定一棵树,树上每个节点有对应的字符,多次询问在\(u\)子树的深度为\(d\)的所有节点上的字符任意组合能否凑成一个回文串 把dfs序存储在一个二维线性表中,一个维度记录字符另一个维度记录深度 ...
- C++求树子节点权重最大的和
#include <iostream> #include <vector> using namespace std; int n; const int MaxN = 1e5; ...
- bzoj2434 fail树 + dfs序 + 树状数组
https://www.lydsy.com/JudgeOnline/problem.php?id=2434 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现, ...
- DFS序和7种模型
DFS序就是将树的节点按照先根的顺序遍历得到的节点顺序 性质:一个子树全在一个连续的区间内,可以与线段树和树状数组搭配使用 很好写,只需在dfs中加几行代码即可. 代码: void dfs(ll u, ...
- 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...
- BZOJ.2434.[NOI2011]阿狸的打字机(AC自动机 树状数组 DFS序)
题目链接 首先不需要存储每个字符串,可以将所有输入的字符依次存进Trie树,对于每个'P',记录该串结束的位置在哪,以及当前节点对应的是第几个串(当前串即根节点到当前节点):对于'B',只需向上跳一个 ...
- dfs序七个经典问题
update-2018.07.23: 原文问题五思路描述有误,已更正. 参考自:<数据结构漫谈>-许昊然 dfs序是树在dfs先序遍历时的序列,将树形结构转化成序列问题处理. dfs有一个 ...
- 【转载】dfs序七个经典问题
作者:weeping 出处:www.cnblogs.com/weeping/ 原文链接 https://www.cnblogs.com/weeping/p/6847112.html 参考自:<数 ...
随机推荐
- yii2验证规则
验证规则 1.内置验证规则 [['sex', 'partner_id'], 'integer'], [['partner_id', 'camp_id',], 'required'], [['creat ...
- AcWing 482. 合唱队形
#include<iostream> using namespace std ; ; int f[N],g[N]; int w[N]; int main() { int n; cin> ...
- windows下tesseract-ocr的安装及使用
For CentOS 7 run the following as root: yum-config-manager --add-repo https://download.opensuse.org/ ...
- C# 后台调用http,post访问url,获取数据
1.封装post方法发送 using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...
- C++-对象指针的滥用
C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: Object *myObject = new Object; 而不是使用: myObject.testFunc(); ...
- path is not a working copy directory
svn: 'G:\chengXu\2017_Year\JFW\Easy7\WebRoot' is not a working copy directory 解决方法: (1)原因:eclipse把sr ...
- python3练习100题——023
再做一道,把这周的任务搞定- 其实看到这道题,很熟悉,让我想起大一时被C语言支配的恐惧.那个时候不停的在push自己,给自己很大的压力.上C语言课的时候让人昏昏欲睡,但是还是逼迫自己打起精神来学习,一 ...
- python 数组array的一些操作
对一些特定大小的元素进行操作 1.将数组Arr中大于100的值都设定为100 Arr[Arr >100] = 100 利用array索引的内置 numpy.minimum(Arr, 100 ...
- anniversary party_hdu1520
本来以为是一道很简单的提,可以分分钟解决(实际上就是很简单) 然而一直报错,找半天,竟然要多组输入(还是太菜了) 所以每组需要先初始化, 这是一道树形DP的简单题,具体思路就是我选这个上司就不能选他的 ...
- OpenCV之XML和YAML文件读写
FileStorage类 该类有两个构造函数 FileStorage::FileStorage() FileStorage::FileStorage(const string& source, ...