
L2-031 深入虎穴 (25 分)
#include using namespace std;
发布日期:2021-05-08 16:29:18
浏览次数:11
分类:精选文章
本文共 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;
}
发表评论
最新留言
不错!
[***.144.177.141]2025年03月29日 21时05分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Hadoop框架:MapReduce基本原理和入门案例
2019-03-06
ThreadPoolExecutor线程池任务执行失败的时候会怎样
2019-03-06
Sentry快速开始并集成钉钉群机器人
2019-03-06
Docker 服务
2019-03-06
第一眼就心动的人还怎么做朋友
2019-03-06
Cassandra数据建模
2019-03-06
Elasticsearch Web管理工具
2019-03-06
Git 配置SSH公钥、私钥
2019-03-06
极客时间离线课堂
2019-03-06
Spring Session
2019-03-06
koa2 中间件里面的next到底是什么
2019-03-06
在create-react-app创建的项目下允许函数绑定运算符
2019-03-06
博客园新闻频道开始公开测试
2019-03-06
评论表聚集索引引起的评论超时问题
2019-03-06
博客园上海俱乐部4月份活动通知邀请函已经发出!
2019-03-06
上周热点回顾(5.24-5.30)
2019-03-06
Internet Explorer 10 专题上线
2019-03-06
云计算之路-阿里云上:0:25~0:40网络存储故障造成网站不能正常访问
2019-03-06
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
2019-03-06
上周热点回顾(12.31-1.6)
2019-03-06