博客
关于我
L2-031 深入虎穴 (25 分)
阅读量:381 次
发布时间:2019-03-05

本文共 1125 字,大约阅读时间需要 3 分钟。

L2-031 深入虎穴 (25 分)

题目

题目说明没有两个路通往一扇门,说明没有环,这是一棵树。问题转化为求树的深度。

思路

由于树的特性,我们可以通过深度优先搜索(DFS)来计算每个节点的深度。为了提高效率,我们采用从叶子节点开始的DFS,加上剪枝技术,避免重复计算深度。剪枝技术的具体实现是:一旦发现某条路径的深度已经达到最大值,就停止进一步的DFS探索。

代码实现了从根节点开始的DFS,记录每个节点的深度值。在计算过程中,采用简单的剪枝技术,避免了不必要的重复计算,确保算法的高效性。

代码

```cpp #include
#include
using namespace std;

#define INF 0x3f3f3f3f3f3f

#define pb push_back

typedef 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;

}

转载地址:http://cpwzz.baihongyu.com/

你可能感兴趣的文章
02、MySQL—数据库基本操作
查看>>
OpenJDK1.8.0 源码解析————HashMap的实现(一)
查看>>
MySQL-时区导致的时间前后端不一致
查看>>
2021-04-05阅读小笔记:局部性原理
查看>>
go语言简单介绍,增强了解
查看>>
python file文件操作--内置对象open
查看>>
架构师入门:搭建基本的Eureka架构(从项目里抽取)
查看>>
MongoDB 快速扫盲贴
查看>>
修复搜狗、360等浏览器不识别SameSite=None 引起的单点登录故障
查看>>
EXTJS4.2——10.Tab+Iframe
查看>>
WEB基础——AJAX
查看>>
one + two = 3
查看>>
PHP serialize && unserialize Security Risk Research
查看>>
sctf_2019_easy_heap
查看>>
ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记
查看>>
PyQt5之音乐播放器
查看>>
Redis进阶实践之十八 使用管道模式提高Redis查询的速度
查看>>
SQL注入
查看>>
#2036:改革春风吹满地
查看>>
MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】
查看>>