https://www.luogu.com.cn/record/112499619 下面是代码,大佬教一下吧QAQ~
#include <bits/stdc++.h>
using namespace std;
vector<int> to_node_number[100001];
int n, m;
int vis[100001]; // 记忆化搜索
int A(int x, int depth) // DFS (深度优先搜索)
{
printf ("[wsDbg] [Line 8] [clock %d] vis[%d] = %d, depth = %d, to_node_number[%d].size() = %d\n", clock(), x, vis[x], depth, x, to_node_number[x].size());
if (vis[x] != -1) // 如果已经得到结果
{
return vis[x]; // 直接返回即可
}
int ans = -2147483647;
for (int i = 0; i < to_node_number[x].size(); i++)
{
ans = max(ans, A(to_node_number[x][i], depth + 1));
}
if (to_node_number[x].size() == 0) // 如果是叶子节点
{
return depth; // 直接返回深度。
}
vis[x] = ans; // 存储得到的结果
return ans;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
to_node_number[u].push_back(v); // 反向建边【暂时禁用】
}
memset (vis, -1, sizeof(vis));
for (int i = 1; i <= n; i++)
{
cout << A(i, 1) << ' ';
}
cout << endl;
return 0;
}