算法学习系列(二十):树与图的DFS与BFS

目录

  • 引言
  • 一、图的存储
    • 1.邻接矩阵
    • 2.邻接表
  • 二、图的DFS
    • 1.模板
    • 2. 例题:树的重心
  • 三、图的BFS
    • 1.模板
    • 2.例题:图中点的层次

引言

关于这个树与图考察的还是比较多的,其实就是图,树就是一种特殊的图,树是一种无环无向图,关于图本文主要介绍图的存储方式以及他们的DFS与BFS模板怎么写,并且介绍了相应的例题。

一、图的存储

稠密图用邻接矩阵(n ^ 2 == m),稀疏图用邻接表(n == m)。

1.邻接矩阵

邻接矩阵就是给出一个g[a][b]代表,结点a到结点b存在一条边,权重为g[a][b],若是无边可用INF代替。一般若是有重边的话,一般取最小的那一条。

2.邻接表

邻接表和哈希算法的拉链法很像,h数组代表每个结点,每个结点自成一个链表的头结点,代表与之相连的边。这里讲的都是有向图,无向图就相当于每条无向边都是两个有向边。

int h[N], e[M], ne[M], w[N], idx;void add(int a, int b, int c)  //a->b,权重为c
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

二、图的DFS

1.模板

//这里就拿邻接表来举例
const int N = 1e5+10;int n, m;
int h[N], e[N], w[N], ne[N], idx;
bool st[N];void dfs(int u)  //代表当前访问的结点的编号
{st[u] = true;for(int i = h[u]; i != -1; i = ne[i]){int j = e[i];  //j代表连边的编号,i代表的是idxif(st[j]) continue;  //访问过了就返回}
}

2. 例题:树的重心

给定一颗树,树中包含 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 <cstdio>
#include <cstring>
#include <iostream>using namespace std;const int N = 1e5+10, M = N * 2,INF = 0x3f3f3f3f;int n, ans = INF;
int h[N], e[M], ne[M], idx;
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 = 1;  //size代表当前u结点连通块的最大值,sum代表当前结点所连通的结点数和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);  //因为是dfs遍历的只能找到下面的结点,上面相连的连通块拿总和一减就知道了ans = min(ans, size);return sum;
}int main()
{memset(h, -1, sizeof h);scanf("%d", &n);for(int i = 0; i < n - 1; ++i) {int a, b;scanf("%d%d", &a, &b);add(a,b), add(b,a);  //无向边的处理}dfs(1);printf("%d\n", ans);return 0;
}

三、图的BFS

注意:当求最短路问题时,只有当每条边的权重都是一样的那么,才可以用BFS来求最短路问题,否则你第一次到达的路径,不一定是最短的,这时候就得用迪杰斯特拉等最短路算法来求了。

1.模板

//这里就拿邻接表来举例
const int N = 1e5+10, INF = 0x3f3f3f3f;int start, end;
int h[N], e[N], w[N], ne[N], idx;  //w[i]也是边idx对应的权重
int dist[N], q[N];  //这里的dist[i]的i代表的是idx,也就是边void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}int bfs(int start)  
{memset(dist, 0x3f, sizeof dist);dist[start] = 0;int hh = 0, tt = -1;q[++tt] = start;while(hh <= tt){auto t = q[hh++];if(t == end) return dist[t];for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(dist[j] != INF) continue;dist[j] = dist[t] + w[i];q[++tt] = j;}}return -1;
}

2.例题:图中点的层次

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。所有边的长度都是 1,点的编号为 1∼n。请你求出 1 号点到 n 号点的最短距离,如果从 1号点无法走到 n 号点,输出 −1。输入格式
第一行包含两个整数 n 和 m。
接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。数据范围
1≤n,m≤105输入样例:
4 5
1 2
2 3
3 4
1 3
1 4
输出样例:
1
#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;const int N = 1e5, M = N * 2;int n, m;
int h[N], e[M], ne[M], idx;
int dist[M], q[M];void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}int bfs()
{memset(dist, -1, sizeof dist);  //因为权重都为1所以不考虑负边dist[1] = 0;int hh = 0, tt = -1;q[++tt] = 1;while(hh <= tt){auto t = q[hh++];if(t == n) return dist[t];for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(dist[j] != -1) continue;dist[j] = dist[t] + 1;q[++tt] = j;}}return -1;
}int main()
{memset(h, -1, sizeof h);scanf("%d%d", &n, &m);while(m--){int a, b;scanf("%d%d", &a, &b);add(a,b);  //就算有重边和自环,每条边的权重都为1,所以没影响}printf("%d\n", bfs());
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

brpc: a little source code

之前在https://www.yuque.com/treblez/qksu6c/nqe8ip59cwegl6rk?singleDoc# 《olap/clickhouse-编译器优化与向量化》中我谈过brpc的汇编控制bthread。本文就来看一下brpc作为一个高性能的rpc实现&#xff0c;除了自定义线程栈之外&#xff0c;代码还有什么优秀之处。 因为时间…

三国杀移动版武将台词大全-神

三国杀移动版武将台词大全-魏-CSDN博客 三国杀移动版武将台词大全-蜀-CSDN博客 三国杀移动版武将台词大全-吴-CSDN博客 三国杀移动版武将台词大全-群-CSDN博客 三国杀移动版武将台词大全-神-CSDN博客 # 神&#xff08;17/17&#xff09;&#xff1a; # 神刘备 神华佗 …

Vue3 不同版本的Pinia如何做持久化存储

不同版本的pinia支持的存储插件不同&#xff0c;高/低版本的持久化存储插件整合如下&#xff0c;都是我实践过的&#xff0c;请放心使用。&#x1f60a; 一、Vue3.2&#xff0c;pinia < 2.0.5&#xff0c;用pinia-plugin-persist 提示&#xff1a;不要去下最新的pinia-plug…

QT基础篇(5)QT5主窗口

1.QT5主窗口 QT5主窗口由以下几个部分构成&#xff1a; 标题栏&#xff1a;位于窗口的顶部&#xff0c;显示窗口的标题和控制按钮&#xff08;最小化、最大化、关闭&#xff09;。菜单栏&#xff1a;位于窗口的顶部&#xff0c;包含一系列菜单和菜单项&#xff0c;用于添加和…

K8S后渗透横向节点与持久化隐蔽方式探索

前言 通常在红蓝对抗中&#xff0c;我们可能会通过各种方法如弱口令、sql注入、web应用漏洞导致的RCE等方法获得服务器的权限&#xff1b;在当前云原生迅猛发展的时代&#xff0c;这台服务器很可能是一个容器&#xff0c;在后续的后渗透由传统的提权变为容器逃逸&#xff0c;内…

easyexcel上传校验的方法封装

easyexcel版本3.1.5 使用自定义注解的方式来定义校验的类型&#xff0c;避免冗余代码。 //校验value不能为空&#xff0c;且长度最大为30 RowCheck(value {RowCheckType.EMPTY,RowCheckType.LENGTH},max 30) private String value; 具体代码&#xff1a; 首先定义校验类型…

RTSP协议实现发送ACC音频数据

一.AAC音频格式介绍 AAC音频格式&#xff1a;Advanced Audio Coding&#xff08;高级音频解码&#xff09;&#xff0c;是一种由MPEG—4标准定义的有损音频压缩格式。音频压缩编码的输出码流&#xff0c;以音频帧的形式存在。每个音频帧包含若干个音频采样的压缩数据&#xff0…

Linux常用命令之cp、rm、touch、mv

cp: 复制文件或目录 -f 覆盖目标同名文件或目录时不进行提醒&#xff0c;而直接强制复制。-i 覆盖目标同名文件或目录时提醒用户确认。-p 复制时保持源文件的权限、属主及时间标记等属性不变&#xff08;默认权限属主是变化的&#xff09;。-r 复制目录时必须使用此选项&a…

vue3安装 router 路由

安装路由 cnpm i vue-router在src文件夹下创建router/index.ts import {createRouter,createWebHashHistory} from vue-router const routercreateRouter({history:createWebHashHistory(),routes:[{path:"/",name:home,component: () > import(../views/Home/i…

STL标准库与泛型编程(侯捷)笔记6(完结)

STL标准库与泛型编程&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

力扣(leetcode)第500题键盘行(Python)

500.键盘行 题目链接&#xff1a;500.键盘行 给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中&#xff1a; 第一行由字符 “qwertyuiop” 组成。 第二行由字符 “asdfghjkl” 组成。 第三行由字…

【DP】300. 最长递增子序列

题目 更好的方法是耐心排序&#xff0c;参见《算法小抄》的内容&#xff01;&#xff01;&#xff01; 法1&#xff1a;DP 基础解法必须掌握&#xff01;&#xff01;&#xff01; class Solution {public int lengthOfLIS(int[] nums) {if (nums null || nums.length 0) …

从比特币、以太坊生态,到AI与新公链复兴,谁将接棒2024年的主流叙事?

2023年10月份至今&#xff0c;现货比特币ETF一直都是促使市场反弹的核心叙事之一&#xff0c;如今靴子终于落地&#xff0c;那在ETF预期尘埃落定的大背景下&#xff0c;接下来的加密市场有哪些赛道值得关注&#xff1f; 泛比特币生态 2023年比特币生态浪潮中&#xff0c;OKX等赢…

【DP】354. 俄罗斯套娃信封问题

题目 法1&#xff1a;DP&#xff0c;LIS问题 基本方法&#xff0c;必须掌握&#xff01;&#xff01;&#xff01; class Solution {public int maxEnvelopes(int[][] envelopes) {int n envelopes.length;if (n < 2) {return n;}Arrays.sort(envelopes, (a1, a2) ->…

企业信息化规划该如何落地?以制造型企业为例

企业信息化规划如何落地&#xff1f; 规划做好了&#xff0c;蓝图也画好了&#xff0c;人手一块大饼也已经揣好了&#xff0c;那么该怎么落地呢&#xff0c;这才是最关键的。 我将企业信息化规划落地分为4个周期&#xff0c;以最典型的制造行业为例&#xff0c;以简道云这个企…

Seata TM管理分支事务源码

TM相当于一个中间商&#xff0c;是没有涉及到任何数据库底层操作的。 TransactionalTemplate 1、TM向TC端发起一次开启全局事务的请求 io.seata.tm.api.TransactionalTemplate#beginTransaction --> io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.Strin…

【vue】vue跑马灯vue-marquee-text-component

vue2 npm install vue-marquee-text-component1.2.0 vue3 npm install vue-marquee-text-component 安装完成之后&#xff0c;vue页面全局引入 import Vue from vue import MarqueeText from vue-marquee-text-componentVue.component(marquee-text, MarqueeText) 页面引入 i…

配置DNS

vim /etc/named.conf vim /etc/named.rfc1912.zones cp named.localhost ./kgc.com.zone -p vim kgc.com.zone 设置备用dns服务器 修改主配置文件&#xff0c;并自动同步到从服务器

【分布式技术】监控平台zabbix介绍与部署

目录 一、为什么要做监控&#xff1f; 二、zabbix是什么&#xff1f; 三、zabbix有哪些组件&#xff1f; ​编辑Zabbix 6.0 功能组件&#xff1a; ●Zabbix Server ●数据库 ●Web 界面 ●Zabbix Agent ●Zabbix Proxy ●Java Gateway 四、zabbix的工作原理&#xf…

SQL-数据类型

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…