B题求解
B题我没有用拓扑排序,就是正常的模拟思维,然后开一个数组mp[]记录一下每个点能走的最远距离,
然后一个for扫描一遍数组,for里面套一个while循环,并且在for里面开一个map<int,int> v来记录
一下v[i]有没有被走过。然后就是如果a[j]!=j并且v[j]==0,而且flag>=mp[j]就是flag>=最优解,
就说明可以从j跳到a[j],在while循环要更新falg并且v[j]=1标记为已经走过,退出whil循环后就更新sum
并且for循环继续往下走,但是能过92.59%的数据,我严重怀疑是后来加的数据导致我过不去QWQ
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M = 1e5 + 10;
int a[M];
int n;
int mp[M];
signed main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
int sum = 0;
for (int i = 1; i <= n; i++) {
int j = i;
int flag = 0;
map<int, int> v;
while (mp[j] <= flag && v[j] == 0) {
if (a[j] == j) {
flag++;
mp[j] = flag;
break;
}
v[j] = 1;
flag ++;
mp[j] = flag;
j = a[j];
}
sum = max(sum, flag);
}
cout << sum;
return 0;
}