# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1160516 | jus_teng | 9월 (APIO24_september) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// Build the tree as an adjacency list from the parent array
vector<vector<ll>> buildTree(ll numberOfNodes, vector<ll>& parent) {
vector<vector<ll>> adjacencyList(numberOfNodes);
for (ll i = 1; i < numberOfNodes; i++) {
adjacencyList[parent[i]].push_back(i);
}
return adjacencyList;
}
// Use DFS to find all leaf nodes
void findLeaves(ll node, vector<vector<ll>>& adjacencyList, vector<ll>& leaves) {
if (adjacencyList[node].empty() && node != 0) {
leaves.push_back(node);
}
for (ll child : adjacencyList[node]) {
findLeaves(child, adjacencyList, leaves);
}
}
// Solve for the maximum number of days
int solve(ll numberOfNodes, ll numberOfVolunteers, vector<ll> parent, vector<vector<ll>> volunteerRecords) {
// Build the tree
vector<vector<ll>> adjacencyList = buildTree(numberOfNodes, parent);
// Find all leaves
vector<ll> leaves;
findLeaves(0, adjacencyList, leaves);
sort(leaves.begin(), leaves.end());
// Special case: 0 or 1 leaf
if (leaves.size() <= 1) return leaves.size();
ll maxDays = 0;
// Try all permutations of leaf falling order
do {
// Initialize queues for each volunteer's record
vector<queue<ll>> sequences(numberOfVolunteers);
for (ll i = 0; i < numberOfVolunteers; i++) {
for (ll j = 0; j < volunteerRecords[i].size(); j++) {
sequences[i].push(volunteerRecords[i][j]);
}
}
ll currentDay = 1; // Start with day 1
bool isValid = true;
// Process each leaf in the current order
for (ll i = 0; i < leaves.size(); i++) {
bool found = false;
for (ll vol = 0; vol < numberOfVolunteers; vol++) {
if (!sequences[vol].empty() && sequences[vol].front() == leaves[i]) {
sequences[vol].pop();
found = true;
break;
}
}
if (!found) {
currentDay++; // New day if no volunteer expected this leaf
}
}
// Check if all records are fully used
for (ll vol = 0; vol < numberOfVolunteers; vol++) {
if (!sequences[vol].empty()) {
isValid = false;
break;
}
}
// Update maximum days if this order is valid
if (isValid) {
maxDays = max(maxDays, currentDay);
}
} while (next_permutation(leaves.begin(), leaves.end()));
return maxDays;
}
// Main function to handle multiple test cases
int main() {
ll testCases;
scanf("%lld", &testCases);
while (testCases--) {
ll numberOfNodes, numberOfVolunteers;
scanf("%lld %lld", &numberOfNodes, &numberOfVolunteers);
// Read the parent array
vector<ll> parent(numberOfNodes);
parent[0] = -1; // Root has no parent
for (ll i = 1; i < numberOfNodes; i++) {
scanf("%lld", &parent[i]);
}
// Read volunteers' records
vector<vector<ll>> volunteerRecords(numberOfVolunteers);
for (ll i = 0; i < numberOfVolunteers; i++) {
volunteerRecords[i].resize(numberOfNodes - 1); // Max possible leaves
for (ll j = 0; j < numberOfNodes - 1; j++) {
scanf("%lld", &volunteerRecords[i][j]);
}
}
// Get and print the result
ll result = solve(numberOfNodes, numberOfVolunteers, parent, volunteerRecords);
printf("%lld\n", result);
}
return 0;
}