树的一些基础东西

1、时间戳:

 按照dfs的过程,将每个节点第一次被访问的顺序(v[x]被标记为1时),依次给这n个节点标记1~n的数字即该节点的时间戳。

代码:

1 void dfs(int x){
2     v[x]=1;dfn[x]=++cnt;  //dfn时间戳,cnt初始为0
3     for(int i=head[x];i;i=next[i]){
4         int y=ver[i];
5         if(v[y])continue;
6         dfs(y);
7     }
8 }

2、树的dfs序

 第一次访问到某个节点时,记录其一次编号,回溯时再记录一次它的编号,最后产生2n的节点序列就是树的dfs序。

 性质:某节点x从第一次被标记在节点序列中到第二次被标记之间的节点序列就是以x为根节点的子树的dfs序

代码:

 1 void dfs(int x){
 2     a[++m]=x; //a数组存储dfs序
 3     v[x]=1;  //记录点是否被访问过
 4     for(int i=head[x];i;i=next[i]){
 5         int y=ver[i];
 6         if(v[y])continue;
 7         dfs(y);
 8     }
 9     a[++m]=x;
10 }

3、树的深度

 树中各个节点的深度是自上而下的统计信息,其中根节点深度为0,其它节点深度即到根节点的层数。往下的子节点深度依次+1,即若当前所在节点x的深度为dep[x],则它的子节点y的深度为dep[y]=dep[x]+1;

代码:

1 void dfs(int x){
2     v[x]=1;
3     for(int i=head[x];i;i=next[i]){
4         int y=ver[i];
5         if(v[y])continue;
6         d[y]=d[x]+1;   //父节点向子节点更新深度
7         dfs(y);
8     }
9 }

4、树的子树大小和重心

 树的子树大小是自下而上统计的信息,子树大小即以某个节点x为根节点的子树的节点个数,一般用size[x]表示。容易想到,若x的子节点为:y1、y2……yn,则size[x]=size[y1]+size[y2]+…+size[yn];

 树的重心。指的是对于一个节点x,从树中删去它,产生的若干个不想连的部分中节点数最多的一颗树的节点数size记为maxn,令maxn取最小值的节点x即一颗树的重心。

代码:

void dfs(int x){
    v[x]=1;size[x]=1; //size存储子树大小
    int max_part=0;   //删除x节点后最大子树的大小
    for(int i=head[x];i;i=next[i]){
        int y=ver[i];
        if(v[y])continue;
        dfs(y);
        size[x]+=size[y];
        max_part=max(max_part,size[y]);
    }
    max_part=max(max_part,n-size[x]); //n为整棵子树节点总数
    if(max_part<ans){ans=max_part;pos=x;} //ans记录重心对应的max_part,pos记录重心
}

5、图的连通块的个数和划分

 dfs可以求出森林(即多棵不连通的树)中树的个数,并将节点划分到每棵树中。思路就是不停对没有划分的节点x进行dfs遍历,就会访问所有与x连通的点并对它们划分,直到所有点均被划分为止。

代码:

 1 void dfs(int x){
 2     v[x]=cnt;
 3     for(int i=head[x];i;i=next[i]){
 4         int y=ver[i];
 5         if(v[y])continue;
 6         dfs(y);
 7     }
 8 }
 9 int main()
10 {
11     for(int i=1;i<=n;i++)
12         if(!v[i]){cnt++,dfs(i);} //cnt即连通块个数
13 }

原文地址:https://www.cnblogs.com/five20/p/8530924.html

时间: 2025-01-12 03:48:45

树的一些基础东西的相关文章

Bzoj1036 树链剖分基础题

树链剖分的基础题 因为复习到了这个部分突然发现竟然没有题解所以现在补一个.. 一些基础的东西... 重儿子:siz[u]为v的子节点中siz值最大的,那么u就是v的重儿子. 轻儿子:v的其它子节点. 重边:点v与其重儿子的连边. 轻边:点v与其轻儿子的连边. 重链:由重边连成的路径. 轻链:轻边. 然后简单的用两次dfs计算出每个节点的father,deep,size, son,w,top 其他简单的就不说了 w表示的是当前节点与其付清节点的连边在线段树中的位置 top表示的是当前节点所在的链的

web基础知识(一)关于ajax传值最基础东西

HTTP方法之 GET对比POST GET:从指定的资源请求数据, POST:向指定的资源提交要被处理的数据 GET方法: 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: /test/demo_form.asp?name1=value1&name2=value2 有关 GET 请求的其他一些注释: GET 请求可被缓存 GET 请求保留在浏览器历史记录中 GET 请求可被收藏为书签 GET 请求不应在处理敏感数据时使用 GET 请求有长度限制 GET 请求只应当用于取回

web基础知识(二)关于ajax,Jquery传值最基础东西

这次还是一些关于jQuery,ajax前后台传值情况, 是自己在做点小东西过程中遇到的,记录下来为自己也方便别人 列表很多,点击编辑和删除无刷新的进行操作的话,肯定是ajax了,因为无刷新嘛,可能有的朋友会说直接传值,传ID到Action删除不就OK了,用得着写js么,纯粹自己找麻烦嘛. 其实这里重点是无刷新的啦, 这个上传后到这里来,有个预览功能,把本次的全部预览,如果全部刷新的话,那么刚才上传的就不会在这个页面了,so,还是采用无刷新的比较好. 点击编辑跳到一个新的页面的时候有两种方法可以选

web基础知识(三)关于ajax,Jquery传值最基础东西

今天补充一下两个小功能,一个是关于radio单选框的情况,如何在前面选了后,传到后台,编辑修改的时候再次传回来,并且在当时选的那个上:再一个就是关于添加小标签的时候添加接着弹出在下面,并点击出现删除. 一:radio 1 <div class="newlylist"> 2 <div class="newlyhead">图示商品:</div> 3 <div class="newlycontent">&

poj2528-Mayor&#39;s posters-线段树离散化、基础

题意:高度为1byte的n(n <= 10000)张海报贴在高度为1byte长度为10000000byte的板上.海报按顺序张贴,给出每张海报的张贴范围,求最后能够看见多少张海报(不完整的都算). 思路:因为数组不可能开10^7那么大,而且海报的张数只有10000张,则边界值最多20000个,于是我们离散化坐标值,这里用到了sort.unique.还有lower_bound去二分查找.用sort排序,unique去重后的数组的元素个数建线段树,之后,就是线段树的区间操作.lazy标记了.线段树记

20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在该进程的地址空间(这里的地址空间具体是哪个地方?)中.其他进程可以将同一段共享内存连接到自己的地址空间中.所有进程都可以访问共享内存中的地址,就好像它们是malloc分配的一样.如果一个进程向共享内存中写入了数据,所做的改动将立刻被其他进程看到 共享内存是IPC最快捷的方式,因为共享内存方式的通信没

HDU 1698 Just a Hook (线段树 区间更新基础)

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21856    Accepted Submission(s): 10963 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing

LA 2038 战略游戏(树的动态规划基础题/无根树转有根树/树的最大最小结点集)

题目大意就是求树的最小结点集,树上的动态规划基础题,一次深搜就可以解决问题 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #i

Java基础东西(按位操作运算)

http://aokunsang.iteye.com/blog/615658 前奏:   昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊,是吧?但是那哥们的回答,让我郁闷半天:"这都不会啊,都是Java基础的东西呀!"我靠,我晕倒,听着老不爽了,so我决定对位移一探究竟,原来也这么随意啊,哈哈.因此,把心得总结如下,欢迎收看. 在这里先感谢一下,JavaEye上的高手们的技术博客指点.TKS very much. 技术总结: