Codeforces 1941G. Rudolf and Subway
原题链接
中等
作者:
偷月亮的喵
,
2025-05-10 19:07:51
· 安徽
,
所有人可见
,
阅读 2
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N = 200000;
int n;
vector<int> e[N + 5];
int g[N + 5];
int f[N + 5]; // f[i] : 从链的末尾⾛到i点所经过的点的数量;
int ans;
void init()
{
for (int i = 1; i <= n; i++) e[i].clear(), g[i] = 0, f[i] = 0;
return;
}
void topsort()
{
queue<int> q;
for (int i = 1; i <= n; i++)
{
if (!g[i])
{
q.push(i);
}
}
while (!q.empty())
{
int u = q.front();
q.pop();
ans = max(ans, f[u]);
for (auto v : e[u])
{
f[v] = max(f[v], f[u] + 1);
g[v] -= 1;
if (!g[v])
{
q.push(v);
}
}
}
return;
}
void solve()
{
cin >> n;
init();
for (int i = 1; i <= n; i++)
{
int a;
cin >> a;
e[i].push_back(a);
g[a] += 1;
}
ans = -1;
topsort();
cout << ans + 3 << endl;
return;
}
int main()
{
int t;
cin >> t;
while (t--) solve();
return 0;
}