搜索
文章平均质量分 68
通过遍历找到最优解
.SAI.
十年感悟 两年参悟
展开
-
最近公共祖先 (LCA倍增)
题目描述:题目解题思路:首先思考暴力算法,我们先将待处理的 u,vu,vu,v 两点移动到相同深度的地方,然后两个一起向个自的父节点往上跳,直到跳到最后一次父节点相同的时候即为它们的最近公共祖先。很显然这个思想是没有问题,但是要是纯属暴力的一级一级往上跳这样实现,很显然会超时,那么我们就可以考虑倍增优化。对于倍增,我们知道他可以把一大段繁琐的步骤压缩为一个一次就进行 2x2^x2x 次的步骤进行对步骤的加速。因此我们可以把算法中的一级一级往上跳转换为每次跳 2i2^i2i 级,也就是说在树上倍增原创 2022-01-19 11:06:57 · 943 阅读 · 0 评论 -
强连通分量 (Kosaraju)
问题描述求一个有向图中的强连通分量的个数。解题思路:明确一下强连通的定义:存在 iii 和 jjj 两点,使得 iii 和 jjj 互相可抵达。根据强连通的定义,我们可以得出,若对存在强连通的图进行置换(将所有有向边反转),那么强连通任然是强连通的。这里我们先给出一张存在两个强连通的图以及它的置换图。接下来是算法的步骤: 先任意找到一个点对原图进行 dfsdfsdfs 遍历一遍,然后将每个节点出栈的顺序记录。这一步骤保证了接下来算法求出的强连通分量是按照拓扑排序给出的。 按原创 2022-01-14 09:40:57 · 452 阅读 · 0 评论 -
P3853 [TJOI2007]路标设置 (二分答案)
什么最大值最小,最小值最大——二分就完了! 什么最大值最小,最小值最大——二分就完了! 什么最大值最小,最小值最大——二分就完了!题目描述:洛谷题目传送门戳他!!分析:看到这种题目,我们可以直接暴力枚举加剪枝枚举最优答案,然后愉快超时……我们为什么对于这种题目不暴力呢?因为怕超时?错!是出于对于程序猿的尊严,暴力太没逼格了!对于粗暴的枚举,我们更愿意接受优雅的二分答案相性各位对于什么二分思路啊,二分查找什么的都不陌生,这里就不过多阐述了,直接上模板!如果真的想零基础学习二分,原创 2021-08-17 20:26:17 · 228 阅读 · 7 评论 -
P1434 滑雪(记忆化搜索 / 线性DP)
题目描述:题目传送门解题思路:此题可以考虑使用记忆化搜索和动态规划来做。记忆化搜索:原创 2021-12-11 16:41:59 · 529 阅读 · 1 评论 -
SSL 1455 电子老鼠闯迷宫
题目描述:样例错了,输出为 27。解题思路:这一题就是一道裸的广搜,主要就是考虑路径输出。我们需要一个 preipre_iprei ,记录节点 iii 在广搜中是由哪个节点转移的,然后最后用递归一步步倒推输出,即可处理路径问题。输出路径函数:void print(int p){ if(p==1) { cout<<"("<<SX<<","<<SY<<")->"; return ; } pr原创 2021-12-15 16:46:14 · 2696 阅读 · 0 评论 -
SSL 1759 连通分量(七种做法)
题目描述:解题思路:首先需要有前置知识,在无向图中,联通分量表示最大联通子图中的节点个数。然后我们考虑多种做法。做法一:dfs+dfs+dfs+ 邻接矩阵#include <iostream>#include <cstring>using namespace std;int n,g[1001][1001]={0},sum;bool vis[100010]={false};int dfs(int x){ vis[x]=true; for(int i原创 2021-12-17 20:09:04 · 651 阅读 · 5 评论 -
51nod 2667 染车(广度搜索)
题目描述:解题思路:我们可以把每辆车试做一个点,那么这辆车所能互相攻击到的车辆之间就相当于存在一条边。那么很显然,只有互相不被所有车攻击到的车才能染成不同的颜色,那么也就是说同一连通块中的车辆都能被攻击到,也就是连通块的个数即为最大染色个数。可以想到,只有具备攻击力的车辆才能进行扩展,,才能加入队列,而作为空地的点仅仅相当于类似边的存在,不用加入队列。接下来就是非常基础的广搜爆搜。CODE:#include <bits/stdc++.h>using namespace std原创 2021-12-17 21:25:21 · 320 阅读 · 1 评论