当前位置: 首页 > news >正文

acwing算法基础之搜索与图论--树与图的遍历

目录

  • 1 基础知识
  • 2 模板
  • 3 工程化

1 基础知识

树和图的存储:邻接矩阵、邻接表。
树和图的遍历:dfs、bfs。

2 模板

树是一种特殊的图(即,无环连通图),与图的存储方式相同。
对于无向图中的边ab,存储两条有向边a->b, b->a。
因此我们可以只考虑有向图的存储。

(1) 邻接矩阵:g[a][b] 存储边a->b

(2) 邻接表:

// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点
int h[N], e[N], ne[N], idx;// 添加一条边a->b
void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}// 初始化
idx = 0;
memset(h, -1, sizeof h);

3 工程化

题目1:求树的重心。把某个结点删除,剩余连通块的最大值。遍历每一个结点,求取这个最大值集合中的最小值。
考察点:用dfs()遍历树,注意走过的结点不用走了。

#include <iostream>
#include <vector>using namespace std;const int N = 1e5 + 10;
int n;
int res = 1e9;
vector<bool> visited(N);
vector<vector<int>> g(N);int dfs(int u) {//返回以u为根结点的子树的结点数目visited[u] = true;int sum = 1;int ans = 0; //把u删除之后的,剩余连通块,数目最大值for (auto x : g[u]) {if (visited[x] == false) {int t = dfs(x);ans = max(ans, t);sum += t;            }}ans = max(ans, n - sum);res = min(res, ans);return sum;
}int main() {cin >> n;int x, y;for (int i = 0; i < n - 1; ++i) {cin >> x >> y;g[x].emplace_back(y);g[y].emplace_back(x);}dfs(1);cout << res << endl;return 0;
}

题目2:给你一张图,结点编号1,2,3…n,给你一些边,边的权重均是1,求结点1到结点n的最短距离,如果不存在路径,输出-1。
考察点:bfs()遍历图。

#include <iostream>
#include <vector>
#include <queue>using namespace std;const int N = 1e5 +10;
vector<vector<int>> g(N);
vector<int> d(N, -1);
int n, m;int main() {cin >> n >> m;int x, y;for (int i = 0; i < m; ++i) {cin >> x >> y;g[x].emplace_back(y);}queue<int> q;q.push(1);d[1] = 0;while (!q.empty()) {int t = q.front();q.pop();//t可以走到哪儿for (auto x : g[t]) {if (d[x] != -1) continue;d[x] = d[t] + 1;q.push(x);}}cout << d[n] << endl;return 0;
}

相关文章:

  • [第二章—Spring MVC的高级技术] 2.2 置multipart解析器
  • 21 移动网络的前世今生
  • Sa-Token拦截全部接口必须登录-然后自定义注解来匿名登录-作为权限框架支持,并且同时使用了注解和路由的拦截器模式,此部分的配置如下:
  • 虚拟机复制后,无法ping通问题解决
  • Flutter——最详细(AppBar)使用教程
  • 【Linux精讲系列】——vim详解
  • 【Linux】:git基本操作_添加文件_两种场景_查看.git文件 || git修改文件 || 版本回退
  • arima模型python代码
  • 网际报文协议ICMP及ICMP重定向实例详解
  • 数据结构—字符串
  • APISpace IP归属地查询接口案例代码
  • 【网络协议】聊聊HTTPDNS如何工作的
  • Python按类别和比例从Labelme数据集中划分出训练数据集和测试数据集
  • 开放智慧,助力学习——电大搜题,打开学无止境的新篇章
  • 使用IDEA让文本对比不在变的困难
  • 「面试题」如何实现一个圣杯布局?
  • CSS 提示工具(Tooltip)
  • JavaScript HTML DOM
  • Javascript Math对象和Date对象常用方法详解
  • Java面向对象及其三大特征
  • JS变量作用域
  • Linux Process Manage
  • magento 货币换算
  • Material Design
  • Python实现BT种子转化为磁力链接【实战】
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 搭建gitbook 和 访问权限认证
  • 给Prometheus造假数据的方法
  • 基于axios的vue插件,让http请求更简单
  • 讲清楚之javascript作用域
  • 看域名解析域名安全对SEO的影响
  • 力扣(LeetCode)21
  • 那些年我们用过的显示性能指标
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一文看透浏览器架构
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Java性能优化之JVM GC(垃圾回收机制)
  • 移动端高清、多屏适配方案
  • ​Python 3 新特性:类型注解
  • ​ubuntu下安装kvm虚拟机
  • #每天一道面试题# 什么是MySQL的回表查询
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (第二周)效能测试
  • (二)pulsar安装在独立的docker中,python测试
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)c52学习之旅-流水LED灯
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET/C# 使用反射注册事件
  • .NET处理HTTP请求
  • ?php echo ?,?php echo Hello world!;?