2020牛客寒假算法基础集训营6.B——图【基环树 & 记忆化dfs】

网友投稿 788 2022-11-19 14:40:35

2020牛客寒假算法基础集训营6.B——图【基环树 & 记忆化dfs】

​​题目传送门​​

题目描述

现在有一个N个点的有向图,每个点仅有一条出边 你需要求出图中最长的简单路径包含点的数量 (1≤N≤1,000,000)

输入描述:

第一行一个数字N 接下来N行,每行一个正整数,第i+1行的数字表示第i个点出边终点的编号 (点从1开始标号)

输出描述:

一行一个数字,最长的简单路径的长度

输入

3 2 3 2

输出

3

题解

AC-Code

#include using namespace std;typedef long long ll;#defineconst int maxn = 1e6 + 7;const int mod = 1e9 + 7;int to[maxn];int vis[maxn];int ans[maxn];int dfs(int now) { vis[now] = 1; if (vis[to[now]]) { // 下一个点 走过 if (ans[to[now]]) { // 同一条路径先算子节点。如果>1说明不是一条路径 ans[now] = ans[to[now]] + 1; } else { // 走到环 int t = now, num = 1; while (to[t] != now) { // 走一圈环,记录环的长度 t = to[t]; ++num; } ans[now] = num; t = now; while (to[t] != now) { // 再走一遍环,更新环上点的答案 t = to[t]; ans[t] = num; } } } else { dfs(to[now]); if (!ans[now]) ans[now] = ans[to[now]] + 1; } return ans[now];}int main() { ios; int n; while (cin >> n) { memset(vis, 0, sizeof vis); memset(ans, 0, sizeof ans); for (int i = 1; i <= n; ++i) cin >> to[i]; int ans = 0; for (int i = 1; i <= n; ++i) { if (!vis[i]) ans = max(ans, dfs(i)); } cout << ans << endl; }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:2020牛客寒假算法基础集训营3——B.牛牛的DRB迷宫II【构造 & 二进制】
下一篇:蓝桥杯 试题 算法训练——猴子吃包子
相关文章