
L2-031 深入虎穴 (25 分)
#include using namespace std;
发布日期:2021-05-08 16:29:18
浏览次数:12
分类:精选文章
本文共 1125 字,大约阅读时间需要 3 分钟。
L2-031 深入虎穴 (25 分)
题目
题目说明没有两个路通往一扇门,说明没有环,这是一棵树。问题转化为求树的深度。
思路
由于树的特性,我们可以通过深度优先搜索(DFS)来计算每个节点的深度。为了提高效率,我们采用从叶子节点开始的DFS,加上剪枝技术,避免重复计算深度。剪枝技术的具体实现是:一旦发现某条路径的深度已经达到最大值,就停止进一步的DFS探索。
代码实现了从根节点开始的DFS,记录每个节点的深度值。在计算过程中,采用简单的剪枝技术,避免了不必要的重复计算,确保算法的高效性。
代码
```cpp #include#define INF 0x3f3f3f3f3f3f
#define pb push_backtypedef pair<int, int> P;
const int N = 1e5 + 10;typedef long long ll;vector<vector
> pre(N); bool vis[N]; int num[N];int dfs(int u) {
if (num[u]) return num[u];if (!pre[u].empty()) return 0;int max_depth = 0;for (auto v : pre[u]) {if (!vis[v]) {vis[v] = true;int d = dfs(v);if (d > max_depth) max_depth = d;}}num[u] = max_depth + 1;return max_depth + 1;}
int main() {
int n;cin >> n;for (int i = 1; i <= n; ++i) {int m;cin >> m;for (int j = 1; j <= m; ++j) {int x;cin >> x;pre[x].pb(i);vis[x] = true;}}int max_depth = -1; int root = -1; for (int i = 1; i <= n; ++i) { if (!vis[i]) { int d = dfs(i); if (d > max_depth) { max_depth = d; root = i; } } } cout << root << endl; return 0;
}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年05月04日 23时42分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
docker安装
2019-03-15
N皇后问题解法(递归+回朔)
2019-03-15
面试题 08.01. 三步问题
2019-03-15
剑指 Offer 11. 旋转数组的最小数字
2019-03-15
word文档注入(追踪word文档)未完
2019-03-15
作为我的第一篇csdn博客吧
2019-03-15
java中简单实现栈
2019-03-15
ajax异步提交失败
2019-03-15
一道简单的访问越界、栈溢出pwn解题记录
2019-03-15
ubuntu18.04.4版本安装docker教程
2019-03-15
Stream 某些API
2019-03-15
关于项目中 对Java 的为空判断整理
2019-03-15
测试调用另一台电脑ip是否有用
2019-03-15
mos-excel集成文档
2019-03-15
Tomcat执行流程!
2019-03-15
chat 快问!
2019-03-15
3.jdk的环境配置
2019-03-15
2.连接池
2019-03-15
1.Html
2019-03-15