| #include <bits/stdc++.h> |
| using namespace std; |
|
|
| int main() { |
| ios::sync_with_stdio(false); |
| cin.tie(nullptr); |
|
|
| int T; |
| cin >> T; |
| while (T--) { |
| int n; |
| cin >> n; |
| vector<int> p(n + 1); |
| for (int i = 1; i <= n; i++) cin >> p[i]; |
|
|
| vector<pair<int, int>> edges(n - 1); |
| vector<vector<int>> adj(n + 1); |
| for (int i = 0; i < n - 1; i++) { |
| int u, v; |
| cin >> u >> v; |
| edges[i] = {u, v}; |
| adj[u].push_back(v); |
| adj[v].push_back(u); |
| } |
|
|
| |
| vector<vector<int>> dist(n + 1, vector<int>(n + 1, -1)); |
| for (int s = 1; s <= n; s++) { |
| queue<int> q; |
| dist[s][s] = 0; |
| q.push(s); |
| while (!q.empty()) { |
| int u = q.front(); q.pop(); |
| for (int v : adj[u]) { |
| if (dist[s][v] == -1) { |
| dist[s][v] = dist[s][u] + 1; |
| q.push(v); |
| } |
| } |
| } |
| } |
|
|
| vector<int> cur = p; |
| vector<vector<int>> operations; |
|
|
| while (true) { |
| |
| bool sorted = true; |
| for (int i = 1; i <= n; i++) { |
| if (cur[i] != i) { |
| sorted = false; |
| break; |
| } |
| } |
| if (sorted) break; |
|
|
| |
| vector<pair<int, int>> deltas; |
| for (int idx = 0; idx < n - 1; idx++) { |
| int u = edges[idx].first, v = edges[idx].second; |
| int x = cur[u], y = cur[v]; |
| int delta = (dist[u][y] + dist[v][x]) - (dist[u][x] + dist[v][y]); |
| deltas.emplace_back(delta, idx); |
| } |
| sort(deltas.begin(), deltas.end()); |
|
|
| |
| vector<pair<int, int>> neg_edges; |
| for (auto& pr : deltas) { |
| if (pr.first <= 0) neg_edges.push_back(pr); |
| } |
|
|
| vector<bool> used(n + 1, false); |
| vector<int> selected; |
|
|
| |
| for (auto& pr : neg_edges) { |
| int idx = pr.second; |
| int u = edges[idx].first, v = edges[idx].second; |
| if (!used[u] && !used[v]) { |
| selected.push_back(idx); |
| used[u] = used[v] = true; |
| } |
| } |
|
|
| |
| if (selected.empty()) { |
| int idx = deltas[0].second; |
| selected.push_back(idx); |
| } |
|
|
| |
| for (int idx : selected) { |
| int u = edges[idx].first, v = edges[idx].second; |
| swap(cur[u], cur[v]); |
| } |
|
|
| |
| vector<int> op; |
| for (int idx : selected) op.push_back(idx + 1); |
| operations.push_back(op); |
| } |
|
|
| |
| cout << operations.size() << "\n"; |
| for (auto& op : operations) { |
| cout << op.size(); |
| for (int e : op) cout << " " << e; |
| cout << "\n"; |
| } |
| } |
| return 0; |
| } |