首页 > 其他分享 >搜索与图论(三)树与图的深度优先遍历---以题为例

搜索与图论(三)树与图的深度优先遍历---以题为例

时间:2024-03-31 14:33:05浏览次数:20  
标签:图论 遍历 重心 idx int sum dfs --- size

给定一颗树,树中包含 n个结点(编号 1∼n)和 n−1 条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

输入格式

第一行包含整数 n,表示树的结点数。

接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。

输出格式

输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

数据范围

1≤n≤105

输入样例

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6

输出样例:

4
#include<iostream>
#include<cstring>
using namespace std;
const int N =100010,M=N*2;
int n;
int h[N],e[M],ne[M],idx;
int ans =N;
bool st[N];

void add(int a,int b){
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}

int dfs(int u){
    st[u]=true;
    int size=0,sum=0;
    for(int i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        if(st[j]){
            continue;
        }
        int s=dfs(j);
        size=max(size,s);
        sum+=s;
    }
    size=max(size,n-sum-1);
    ans=min(size,ans);
    return sum+1;
}

int main(){
    cin>>n;
    memset(h,-1,sizeof h);
    for(int i =1;i<n;i++){
        int a,b;
        cin>>a>>b;
        add(a,b);
        add(b,a);
    }
    dfs(1);
    cout<<ans;
    return 0;
}

 

标签:图论,遍历,重心,idx,int,sum,dfs,---,size
From: https://www.cnblogs.com/Ghost-Knight/p/18106708

相关文章

  • 叨叨点啥 - 搭建自己的博客说说
    原文:https://c12th.cn/archives/10.html前言原来我一直在用Artitalk,因为LeanCloud的原因Artitalk用不了了,尝试过其他的说说,总会出现莫名其妙的问题,最后还是选择了叨叨。叨叨的发布和Gitalk有点相似。原教程源自小冰大佬效果展示教程准备工作......
  • 服务端工程师进化史-从零开始的APP开发(5)
    前章1.开发环境搭建2.项目环境搭建3.golang项目基础框架-前篇4.golang项目基础框架-后篇开始本篇开始搭建管理后台的前端项目,其实纯讲前端好像没啥营养,刚好本项目是采用旧项目改造的基础框架搭建的,就讲讲改造过程中,遇到难点,以及如何处理!主要是笔者工作期间的产物,在给......
  • synchronized 关键字 - 监视器锁 monitor lock
    目录一、1synchronized的特性1、互斥2、可重入   二、synchronized使用示例 1、修饰代码块:明确指定锁哪个对象.2、直接修饰普通⽅法:锁的SynchronizedDemo对象 3、修饰静态方法:锁的SynchronizedDemo类的对象我们重点要理解,synchronized锁的是什么.......
  • 详解 Java多线程带来的的风险-线程安全
    目录一、什么是线程安全? 二、线程不安全的原因1、线程调度是随机的2、修改共享数据:多个线程修改同⼀个变量3、原⼦性 ​编辑(1)什么是原⼦性(2)⼀条java语句不⼀定是原⼦的,也不⼀定只是⼀条指令 (3)不保证原⼦性会给多线程带来什么问题(4)可⻅性:可⻅性指,⼀个线程对共......
  • 数据结构-C语言描述(队列的链表实现)
    概述在日常生活中,先进先出似乎更加符合我们的日常认知。 排队的人群中,队首的人总是先离开,而队尾的人总是后离开。1.队列的基本原理和操作我们知道队列也是一种线性表,而今天我们就用非顺序储存结构(链表)来实现它。首先我们先明确队列的基本操作原理:因为同时涉及到队首和队......
  • 练习3-2 计算符号函数的值
    对于任一整数n,符号函数sign(n)的定义如下:请编写程序计算该函数对任一输入整数的值。输入格式:输入在一行中给出整数n。输出格式:在一行中按照格式“sign(n)=函数值”输出该整数n对应的函数值。输入样例1:10输出样例1:sign(10)=1输入样例2:0输出样例2......
  • JAVA注解-ElementType详解
    ava中元注解(用来标识注解的注解)有四个: @Retention@Target@Document@Inherited; @Retention:注解的保留位置@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含@Retention(RetentionPolicy.......
  • SpringAOP增强-几种不同将注解和切面方法的关联方式
    @Around的作用既可以在目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作;可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标目标方法的执行;可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值;当需要改变目标方法的返回值时,只能使用Aro......
  • Pointer-like classes像指针又像函数
    Pointer-likeclasses像指针又像函数智能指针概念:一个类做出来像类又像指针示例代码:#pragmaonce#ifndef__SHAREPOINTER__#define__SHAREPOINTER__​template<classT>classshared_ptr{public:shared_ptr(T*p):px(p){}T&operator*()const{return*px;}......
  • 常见面试算法题-跳格子
    ■ 题目描述【跳格子】地上共有N个格子,你需要跳完地上所有的格子,但是格子间是有强依赖关系的,跳完前一个格子后,后续的格子才会被开启,格子间的依赖关系由多组steps数组给出,steps[0]表示前一个格子,steps[1]表示steps[0]可以开启的格子:比如[0,1]表示从跳完第0个格子以后第1个......