# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1158854 | jus_teng | September (APIO24_september) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
/*Kahn's algorithm (topological sorting) adapted from https://www.geeksforgeeks.org/topological-sorting-indegree-based-solution/*/
long long kahnAlgo(long long n, long long m, vector<long long> f, vector<vector<long long>> s){
vector<vector<long long>> tree(n);
vector<long long> indegree(n, 0);
for (long long i = 1; i < n; i++){
tree[f[i]].push_back(i);
indegree[i]++;
}
queue<long long> q;
for (long long i = 1; i < n; i++){
if (indegree[i] == 0){
q.push(i);
}
}
vector<long long> leafOrder;
while (!q.empty()){
long long node = q.front();
q.pop();
leafOrder.push_back(node);
long long parent = f[node];
if (--indegree[parent] == 0 && parent != 0){
q.push(parent);
}
}
long long maxK = 1;
for (long long i = 0; i < m; i++){
unordered_map<long long, long long> day;
long long currentDay = 1;
for (long long leaf : s[i]){
if (day.count(leaf) && day[leaf] != currentDay){
return 1;
}
day[leaf] = currentDay;
if (leafOrder.back() == leaf){
leafOrder.pop_back();
currentDay++;
}
}
maxK = max(maxK, currentDay);
}
return maxK;
}
int main(){
long long t, n, m;
scanf("%lld", &t);
for (int i = 0; i < t; i++){
scanf("%lld %lld", &n, &m);
vector<long long> f(n);
f[0] = -1;
for (long long i = 1; i < n; i++){
scanf("%lld", &f[i]);
}
vector<vector<long long>> s(m, vector<long long>(n - 1));
for (long long i = 0; i < m; i++){
for (long long j = 0; j < n - 1; j++){
scanf("%lld", &s[i][j]);
}
}
printf("%lld\n", kahnAlgo(n, m, f, s));
}
return 0;
}