树的基操

树的深度

求树的深度

#include<bits/stdc++.h>
using namespace std;
const int N=1000006;
vector<int>g[N];
int n,ans;
void dfs(int u,int fa,int dep)
{
    ans=max(ans,dep);
    for(int i=0;i<g[u].size();++i)
    {
        int v=g[u][i];
        if(v==fa)continue;
        dfs(v,u,dep+1);
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        char c;
        for(int j=1;j<=n;++j)
        {
            cin>>c;
            if(c=='1')g[i].push_back(j),g[j].push_back(i);
        }
    }
    dfs(1,-1,0);
    printf("%d\n",ans);
    return 0;
}

树的宽度

求树的宽度

#include<bits/stdc++.h>
using namespace std;
const int N=1000006;
vector<int>g[N];
int n,ans,d[N];
void dfs(int u,int fa,int dep)
{
    ++d[dep];
    for(int i=0;i<g[u].size();++i)
    {
        int v=g[u][i];
        if(v==fa)continue;
        dfs(v,u,dep+1);
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        char c;getchar();
        for(int j=1;j<=n;++j)
        {
            scanf("%c",&c);
            if(c=='1')g[i].push_back(j);
        }
    }
    dfs(1,-1,1);
    for(int i=1;i<=n;++i)ans=max(ans,d[i]);
    printf("%d\n",ans);
    return 0;
}

树节点孩子数

求树上每个节点的孩子数

#include<bits/stdc++.h>
using namespace std;
const int N=1000006;
vector<int>g[N];
int n,ans,d[N];
void dfs(int u,int fa,int dep)
{
    ++d[dep];
    for(int i=0;i<g[u].size();++i)
    {
        int v=g[u][i];
        if(v==fa)continue;
        dfs(v,u,dep+1);
    }
}
int main()
{
    scanf("%d",&n);
    g[1].push_back(0);
    for(int i=1;i<=n;++i)
    {
        char c;getchar();
        for(int j=1;j<=n;++j)
        {
            scanf("%c",&c);
            if(c=='1')g[i].push_back(j);
        }
    }
    for(int i=1;i<=n;++i)printf("%d ",g[i].size()-1);
    return 0;
}

树的叶子节点

求树的叶子节点个数

#include<bits/stdc++.h>
using namespace std;
const int N=1000006;
vector<int>g[N];
int n,ans[N],d[N],tot;
void dfs(int u,int fa,int dep)
{
    ++d[dep];
    for(int i=0;i<g[u].size();++i)
    {
        int v=g[u][i];
        if(v==fa)continue;
        dfs(v,u,dep+1);
    }
}
int main()
{
    scanf("%d",&n);
    g[1].push_back(-1);
    for(int i=1;i<=n;++i)
    {
        char c;getchar();
        for(int j=1;j<=n;++j)
        {
            scanf("%c",&c);
            if(c=='1')g[i].push_back(j);
        }
    }
    for(int i=1;i<=n;++i)
        if(g[i].size()==1)++ans[0],ans[++tot]=i;
    printf("%d\n",ans[0]);
    for(int i=1;i<=tot;++i)
        printf("%d ",ans[i]);
    return 0;
}

树的重量

求一每个节点为根的子树大小

#include<bits/stdc++.h>
using namespace std;
const int N=1000006;
vector<int>g[N];
int n,size[N],tot;
void dfs(int u,int fa)
{
    size[u]=1;
    for(int i=0;i<g[u].size();++i)
    {
        int v=g[u][i];
        if(v==fa)continue;
        dfs(v,u);
        size[u]+=size[v];
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1,-1);
    for(int i=1;i<=n;++i)printf("%d\n",size[i]);
    return 0;
}

树的直径

求树的直径长度

用2趟dfs跑出来的

#include<bits/stdc++.h>
using namespace std;
const int N=1000006;
vector<int>g[N];
int n,mx,mu;
void dfs(int u,int fa,int dis)
{
    if(dis>mx){mx=dis;mu=u;}
    for(int i=0;i<g[u].size();++i)
    {
        int v=g[u][i];
        if(v==fa)continue;
        dfs(v,u,dis+1);
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1,-1,0);
    dfs(mu,-1,0);
    printf("%d\n",mx);
    return 0;
}

树的重心

求以树的重心的最大子树大小

#include<bits/stdc++.h>
using namespace std;
const int N=1000006;
struct edge {
    int nxt,to;
} e[N<<1];
int head[N],num_edge;
void add(int from,int to) {
    ++num_edge;
    e[num_edge].nxt=head[from];
    e[num_edge].to=to;
    head[from]=num_edge;
}
int n,siz[N],rt,mn,sum;
void getrt(int u,int fa) {
    int mx=0;siz[u]=1;
    for(int i=head[u]; i; i=e[i].nxt) {
        int v=e[i].to;
        if(v==fa)continue;
        getrt(v,u);
        siz[u]+=siz[v];
        mx=max(mx,siz[v]);
    }
    mx=max(mx,sum-siz[u]);
    if(mx<mn)mn=mx,rt=u;
}
int main() {
    scanf("%d",&n);
    for(int i=1,x,y,w; i<n; ++i) {
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    sum=n;mn=n;getrt(1,0);
    printf("%d\n",mn);
    return 0;
}

总结:全是送分题

原文地址:https://www.cnblogs.com/zzctommy/p/12316991.html

时间: 2024-10-15 20:41:10

树的基操的相关文章

线段树基操

P1816 忠诚 st表竟然写挂了,线段树一遍过(就当练码力) P1198 [JSOI2008]最大数 1.动态在末尾插入一个数 2.输出末尾的L个数的最大值 线段树维护! P3870 [TJOI2009]开关 P2574 XOR的艺术 P2846 [USACO08NOV]光开关Light Switching 三倍经验题!!! 对一段01区间取^1,则若要修改这个o,这段区间的1的个数=区间长度-这段区间的1的个数(t[o].yihuo) 对于一个o,是否修改这个区间,可以对t[o].tag^1

【2017西安邀请赛:A】XOR(线段树+线性基)

前言:虽然已经有很多题解了,但是还是想按自己的理解写一篇. 思路:首先分析题目 一.区间操作 —— 线段树 二.异或操作 —— 线性基 这个两个不难想,关键是下一步的技巧 “或”运算 就是两个数的二进制中,对应位 只要有1,那么就是该位结果就是 1,所以要想k“或”运算后的结果尽量大, 就需要异或出的数,各个位上的1尽量多. 线性基的操作,可以求出区间最大异或和,但是我们需要的结果是  “或”运算. 所以我们可以将 k 取反,然后把所有数在加入线性基之前,全部 “与”运算一遍,再加入线性基. 这

Mongodb3.6 基操命令——help有大用(二)

前言 在上一篇文章Mongodb3.6 快速入门(一)中,我们主要使用两个命令: 1.mongod #启动服务 2.mongo #连接mongodb 对于刚接触mongo的人来说,该怎么给命令传递参数.又该传递什么参数都是一脸懵逼的.本人也是这样.在一开始学习mongo的时候,只能死记硬背别人的代码,别人是怎么写,照抄着来.但发现,这样容易忘记.一开始的时候觉得自己会了,可过了几天就会觉得自己一点不会:"怎么又忘记了,好像没学一样" 其实,对于大多数窗口shell操作,都是有提供hel

kafka基操

本文略长,ctrl+f kafka:0.10.1 confuent:3.1.2 7.通过时间戳查询指定分区的offset 使用的方法(offsetsForTimes()): Properties props = new Properties(); KafkaConsumer<String,String> consumer = new KafkaConsumer<>(props); java.util.Map<TopicPartition,OffsetAndTimestamp&

JavaScript之基操

局部变量前面要加var   如 var name = "jiahuai" 全局变量 name = "jiahuai" 写完每一行JavaScript代码用;号隔开 注释: 单行 // 多行 /* */ 原文地址:https://www.cnblogs.com/yaojiahuai/p/9652265.html

typroa 和markdown基操

目录 标题 一级标题 二级标题 字体 图片 来插入图片,如在同意文件夹上,可直接加图片名 数学公式 编辑表格 标题 一级标题 二级标题 三级标题 无序标题 *加空格,无序标题 也可以使用ctrl = 向上增大标题等级 ? ctrl - 向下减小标题等级 [ 中加TOC]加目录 字体 加粗** ** XXX ** 斜体 * XX* ==变色== == xx== 图片 来插入图片,如在同意文件夹上,可直接加图片名 ,也可输入网页图片地址 leetcodehttps://leetcode-cn.com

pymysql 基操全套

pymysql:python操作mysql 什么是pymysql? pymysql是一个python连接操作mysql数据的一个模块.没有他我们就不能和mysql连接所以安装... 安装 >: pip3 install pymysql 什么是Cursor游标? 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 设置pymysql.cursors.DictCursor,查询的结果是字典,key是表的字段 语法

小白学 Python 爬虫(19):Xpath 基操

人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(7):HTTP 基础 小白学 Python 爬虫(8):网页基

pandas-python入门基操

import numpy as npimport pandas as pd# ---------------------------------------------------------------# 目录# 生成数据# 查看数据# 选择# 缺失值# 运算-apply# 合并# 分组# 重塑-reshape# 数据透视表# 时间序列# 类别-Category# csv数据输入/输出# -----------------------------------------------------