树与图的(深度 + 广度)优先遍历

目录

  • 一、树与图的存储
    • 1.树的特性
    • 2.图的分类
    • 3.有向图的储存结构
  • 二、树与图的深度优先遍历的运用
    • 树的重心
      • 题意分析
      • 代码实现
  • 三、树与图的广度优先遍历的运用
    • 图中点的层次
      • 题意分析
      • 代码实现


一、树与图的存储

1.树的特性

树是一种特殊的图,具有以下两个重要特性:

  1. 无环
    树是一个无环连通图,这意味着树中任意两个节点之间都存在且仅存在一条简单路径,不存在环路。

  2. 连通
    树的所有节点都连通,从任一节点出发都可以达到其他节点。换句话说,树不含孤立的子图,它只有一个连通分量。


2.图的分类

图的分类

3.有向图的储存结构

有向图的储存结构


二、树与图的深度优先遍历的运用

树的重心

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

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

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

输入格式:
第一行包含整数 n n n,表示树的结点数。接下来 n − 1 n−1 n1 行,每行包含两个整数 a a a b b b,表示点 a a a 和点 b b b 之间存在一条边。

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

数据范围:
1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105

输入样例:

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

输出样例:

4

题意分析

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

如下图,4结点删除后个连通块中点数的最大值为5。
例子


代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

const int N = 1e5 + 10, M = N * 2;
int h[N], e[M], ne[M], idx, n, ans = 0x3f3f3f3f;
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 sum = 0, size = 0;

	for (int i = h[u]; i != -1; i = ne[i])
	{
		int j = e[i];
		if (!st[j])
		{
			int s = dfs(j);
			size = max(size, s);
			sum += s;
		}
	}
	size = max(size, n - size - 1);
	ans = min(ans, size);
	return sum + 1;
}
int main()
{
	cin.tie(0);
	ios::sync_with_stdio(false);
	memset(h, -1, sizeof h);
	cin >> n;
	for (int i = 1; i <= n - 1; ++i)
	{
		int a, b;
		cin >> a >> b;
		add(a, b), add(b, a);
	}
	dfs(1);
	cout << ans << endl;
	return 0;
}

三、树与图的广度优先遍历的运用

图中点的层次

题目描述:
给定一个 n n n 个点 m m m 条边的有向图,图中可能存在重边和自环。

所有边的长度都是 1 1 1,点的编号为 1 ∼ n 1∼n 1n

请你求出 1 1 1 号点到 n n n 号点的最短距离,如果从 1 1 1 号点无法走到 n n n 号点,输出 − 1 −1 1

输入格式:
第一行包含两个整数 n n n m m m

接下来 m m m 行,每行包含两个整数 a a a b b b,表示存在一条从 a a a 走到 b b b 的长度为 1 1 1 的边。

输出格式:
输出一个整数,表示 1 1 1 号点到 n n n 号点的最短距离。

数据范围:
1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^5 1n,m105

输入样例:

4 5
1 2
2 3
3 4
1 3
1 4

输出样例:

1

题意分析

  1. 本题是图的存储 + BFS的结合。

  2. 图的存储结构使用的是邻接表

  3. 图的权值是 1 的时候,重边和环不用考虑。

  4. 所有长度都是 1,表示可以用 bfs 来求最短路,否则应该用 Dijkstra 等算法来求图中的最短路径。

  5. bfs需要记录的是出发点到当前点的距离,就是d数组,每次d要增加1

  6. 注意数组的初始化:
    (1) memset(h,-1,sizeof h); // 数组的整体初始化为-1,这是链表结束循环的边界,缺少会 TLE(Time Limit Exceeded)。
    (2) memset(d,-1,sizeof d); // 表示没有走过。


代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<queue>

using namespace std;
const int N = 1e5 + 10;
int h[N], e[N * 2], ne[N * 2], d[N], n, m, idx;

void add(int a, int b)
{
	e[idx] = b;
	ne[idx] = h[a];
	h[a] = idx++;
}
int bfs()
{
	queue<int> q;
	q.push(1);
	d[1] = 0;
	while (q.size())
	{
		auto t = q.front();
		q.pop();
		for (int i = h[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			if (d[j] == -1)
			{
				d[j] = d[t] + 1;
				q.push(j);
			}
		}
	}
	return d[n];
}
int main()
{
	cin.tie(0);
	ios::sync_with_stdio(false);
	memset(h, -1, sizeof h);
	memset(d, -1, sizeof d);
	cin >> n >> m;
	for (int i = 1; i <= m; ++i)
	{
		int a, b;
		cin >> a >> b;
		add(a, b);
	}
	cout << bfs() << endl;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/37706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

7.Java 运算符

运算符分成以下几组 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 1.算术运算符 public class Test {public static void main(String[] args) {int a 10;int b 20;int c 25;int d 25;System.out.println("a b " (a b) );System.out.print…

奥威BI-金蝶云星空SaaS版一站式平台:对接数据、做分析

金蝶云星空和BI大数据分析平台都在企业数字化转型中扮演了重要的角色&#xff0c;为企业提供了全面的数字化解决方案和数据分析功能&#xff0c;两者强强联合不仅能提高部署效率&#xff0c;更能增强数据分析、数据可视化效果&#xff0c;帮助企业更好地适应市场变化和用户需求…

基于SSM的新生报到系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Interactive Image Segmentation

Focused and Collaborative Feedback Integration for Interactive Image Segmentation CVPR 2023 清华 Interactive image segmentation aims at obtaining a segmentation mask for an image using simple user annotations. During each round of interaction, the segment…

科技资讯|苹果Vision Pro预计2024年末全球发售

据彭博社记者古尔曼消息&#xff0c;苹果首款头显Vision Pro计划于2024年初在美国市场指定店铺进行开售&#xff0c;这些商店将会有专属区域用于产品演示&#xff0c;配备座位、配件和测量尺寸的工具等。知情人士透露&#xff0c;将有270家美国的苹果商店会销售Vision Pro&…

基于JSP+Servlet的医药药品管理系统

用户类型&#xff1a;双角色角色&#xff08;患者、管理员[医生]&#xff09; 设计模式&#xff1a;MVC&#xff08;jspservletjavabean) 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 主要技术&#xff1a;jsp、servlet、jdbc、jsp、html5、jquery、css、js…

小程序项目时间选择器用法

项目需求是要实现这种形式, 但是相信大家都试了各种插件,都不太合适,uView框架也不能满足自己的需要; 推荐使用:uview-ui-plus 基本上小程序遇到的单选多选 日期 省市区 都可以完美的实现,可以通过插件市场安装使用 但是要实现ui给的原型图 还需要做一下调整 弹性布局给两个选…

【Linux】1、装机、装操作系统、部署

文章目录 一、装系统1.0 格式化 U 盘1.1 做启动盘1.1.2 rufus1.1.2 poweriso 1.2 安装步骤 二、恢复系统2.1 BootManager2.2 recovery mode 一、装系统 下载地址&#xff1a; http://old-releases.ubuntu.com/releases/16.04.5/ubuntu-16.04.5-server-amd64.isohttps://mirro…

C#内存不够解决方法

今天在使用C#程序的时候&#xff0c;出现了下图的问题&#xff1a; 注意下图中我用红框标出的位置&#xff0c;实际是一个三维数组。 但是出现这个问题和三维数组没有关系。 他是提示内存不足。 百度了一下&#xff0c;C#在生成的过程中如果是生成对应的32位系统&#xff0c…

C国演义 [第九章]

第九章 买卖股票的最佳时机III题目理解步骤dp数组递推公式初始化遍历方向 代码 买卖股票的最佳时机IV题目理解步骤dp数组递推公式初始化遍历方向 代码 买卖股票的最佳时机III 力扣链接 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格 设计一个算法…

制作Visual Studio离线安装包

vs2015之后官网就不提供离线安装包了&#xff0c;使用离线安装包就需要自己手动制作一个&#xff1b; 以vs2019为例&#xff1a; 先去官网下载在线安装器 官网下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 展开2019的标签…

2023.7.15

同余最短路 P3403 跳楼机 题意&#xff1a;给定h高的楼层&#xff0c;起始位置在第一层&#xff0c;可以选择操作向上移动x层或y层或z层&#xff0c;回到第一层 求可以到达的楼层数 思路&#xff1a;转化题意为求axbyczk(k在[1,h]&#xff0c;x,y,z为正整数,有多少k满足条件&am…

推荐一款IDEA神级插件【Bito】而且免费!

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

动态规划之118杨辉三角(第6道)

题目&#xff1a;给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目链接&#xff1a;118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 示例&#xff1a; 解法&#xff1…

C/C++实现高并发http服务器

http高并发服务器实现 基础知识 html&#xff0c;全称为html markup language&#xff0c;超文本标记语言。 http&#xff0c;全称hyper text transfer protocol&#xff0c;超文本传输协议。用于从万维网&#xff08;WWW&#xff1a;World Wide Web&#xff09;服务器传输超…

异地使用PLSQL远程连接访问Oracle数据库【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 转载自cpolar极点云文章&#xff1a;公网远程连接…

Jenkins的几种安装方式以及邮件配置

目录 Jenkins介绍 Jenkins下载、安装 一、通过war包安装 二、通过docker安装 jenkins 容器中添加 git, maven 等组件 jenkins 容器中的公钥私钥 在 jenkins 容器中调用 docker 简单的方式启动 Docker server REST API 一个 jenkins 示例 三、通过Homebrew安装 访问Je…

【DC-DC】AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式,高效率、外围简单、内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度降压LED恒流驱动芯片。最大电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&…

从源码全面解析 dubbo 消费端服务调用的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

插入排序法解析

插入排序法解析 什么是插入排序法 插入排序法是一种简单但有效的排序算法&#xff0c;其基本思想是将一个待排序的元素逐个插入到已经排好序的元素序列中&#xff0c;直至所有元素都被插入完成&#xff0c;从而得到一个有序序列。 具体步骤如下&#xff1a; 假设初始时&…
最新文章