题目
题目链接
题解DFS。 蓝桥杯中,一般看到图不是BFS就是DFS。
代码1对应第一种方法,我的方法:
根据关键点的定义:删除这个点之后,无法实现从u
到v
。 那么我们就枚举每个点作为删除点,判断删除这个点之后还能不能实现从u
到v
。若不能说明删除的点为关键点,否则非关键点。
在代码实现的时候,我想把删除点的标记数组与已访问的标记数组统一成一个,但是发现搜索的时候存在将已访问结点进行标记和恢复操作,这也影响到了删除点的标记,实际上删除点的标记应该是一成不变的。所以还是要将两个数组分开。
更新于2022.4.2 实现代码时定义一个del变量表示被删除的点的编号,dfs遇到直接continue。
枚举被删除的点时只排除终点,也就是说也存在删除起点的情况,因为我们需要先判断起点和终点是否连通,删除起点相当于其他点一个都没删除,如果在这种情况下都无法保证存在一种到达终点的情况,那么说明不连通,输出-1,其他情况正常输出统计的个数。
代码2对应第二种方法,也是网上比较多的方法:
这种方法的思想:关键点就是每条从u
到v
的路径都包含的点就是关键路径,或者说某个点在在路径中的出现次数与路径总数相等就是关键点。
正常的从起点DFS,到达终点就将当前保存的路径上全部点对应于保存点出现次数的数组中相应的值加一。跑完DFS后,遍历每个点(除起点和终点)判断次数是否为路径总数,是则答案加一。
邻接表还是要学学的,稀疏图好用,其实不理解可以只背代码。
代码1代码更新于2022.4.2
#include
using namespace std;
const int N = 1e3+10;
int vis[N], e[N m;
memset (h, -1, sizeof h);
for(int i = 1;i > a >> b, add (a, b), add (b, a);
cin >> u >> v;
for(int i = 1;i v,说明删除的这个点i是关键点
}
}
if (!ans) cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?