#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<int> colors, color_counters;
vector<int> visited;
vector<int> parent;
vector<map<int, set<int>>> neighbors;
vector<int>total_size;
vector<vector<int>> graph;
vector<vector<int>> collectedd;
queue<pair<int, int>>q;
void merge(int a, int b) {
a = parent[a];
b = parent[b];
if (a == b) {
return;
}
if ((int)total_size[a] < (int)total_size[b]) {
swap(a, b);
}
total_size[a] += total_size[b];
for (auto &[c, vertices] : neighbors[b]) {
for (auto v : vertices) {
neighbors[a][c].insert(v);
if ((int)neighbors[a][c].size() == color_counters[c]) {
q.push({a, c});
}
}
}
for (int v : collectedd[b]) {
collectedd[a].push_back(v);
parent[v] = a;
}
collectedd[b].clear();
collectedd[b].shrink_to_fit();
neighbors[b].clear();
}
void solve() {
int n, m, k;
cin >> n >> m >> k;
colors.resize(n);
color_counters.resize(k);
parent.resize(n);
neighbors.resize(n);
graph.resize(n);
total_size.resize(n);
visited.resize(k);
collectedd.resize(n);
while (!q.empty()) q.pop();
// cout << "HA\n";
for (int i = 0; i < k; ++i) {
color_counters[i] = 0;
visited[i] = 0;
}
for (int i = 0; i < n; ++i) {
cin >> colors[i];
colors[i]--;
color_counters[colors[i]]++;
}
for (int i = 0; i < n; ++i) {
parent[i] = i;
graph[i].clear();
collectedd[i] = {i};
neighbors[i] = {{colors[i], {i}}};
if (color_counters[colors[i]] == 1) {
q.push({i, colors[i]});
}
total_size[i] = 1;
}
for (int u,v, i = 0; i < m; ++i) {
cin >> u >> v;
u--; v--;
graph[u].push_back(v);
graph[v].push_back(u);
}
for (int u = 0; u < n; ++u) {
for (int v : graph[u]) {
if (colors[u] == colors[v]) {
merge(u, v);
}
}
}
while (!q.empty()) {
auto [v, c] = q.front();
// cout << v << " " << c << "\n";
q.pop();
if (visited[c] || parent[v] != v) {
continue;
}
visited[c] = 1;
auto vec = neighbors[v][c];
for (int u : vec) {
for (int x : graph[u]) {
merge(x, u);
}
}
}
bool ok = true;
for (int i = 0; i < k; ++i) {
if (!visited[i] && color_counters[i] > 0) ok = false;
}
if (ok) {
cout << "TAK\n";
} else {
cout << "NIE\n";
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--) {
solve();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #include <bits/stdc++.h> using namespace std; using ll = long long; vector<int> colors, color_counters; vector<int> visited; vector<int> parent; vector<map<int, set<int>>> neighbors; vector<int>total_size; vector<vector<int>> graph; vector<vector<int>> collectedd; queue<pair<int, int>>q; void merge(int a, int b) { a = parent[a]; b = parent[b]; if (a == b) { return; } if ((int)total_size[a] < (int)total_size[b]) { swap(a, b); } total_size[a] += total_size[b]; for (auto &[c, vertices] : neighbors[b]) { for (auto v : vertices) { neighbors[a][c].insert(v); if ((int)neighbors[a][c].size() == color_counters[c]) { q.push({a, c}); } } } for (int v : collectedd[b]) { collectedd[a].push_back(v); parent[v] = a; } collectedd[b].clear(); collectedd[b].shrink_to_fit(); neighbors[b].clear(); } void solve() { int n, m, k; cin >> n >> m >> k; colors.resize(n); color_counters.resize(k); parent.resize(n); neighbors.resize(n); graph.resize(n); total_size.resize(n); visited.resize(k); collectedd.resize(n); while (!q.empty()) q.pop(); // cout << "HA\n"; for (int i = 0; i < k; ++i) { color_counters[i] = 0; visited[i] = 0; } for (int i = 0; i < n; ++i) { cin >> colors[i]; colors[i]--; color_counters[colors[i]]++; } for (int i = 0; i < n; ++i) { parent[i] = i; graph[i].clear(); collectedd[i] = {i}; neighbors[i] = {{colors[i], {i}}}; if (color_counters[colors[i]] == 1) { q.push({i, colors[i]}); } total_size[i] = 1; } for (int u,v, i = 0; i < m; ++i) { cin >> u >> v; u--; v--; graph[u].push_back(v); graph[v].push_back(u); } for (int u = 0; u < n; ++u) { for (int v : graph[u]) { if (colors[u] == colors[v]) { merge(u, v); } } } while (!q.empty()) { auto [v, c] = q.front(); // cout << v << " " << c << "\n"; q.pop(); if (visited[c] || parent[v] != v) { continue; } visited[c] = 1; auto vec = neighbors[v][c]; for (int u : vec) { for (int x : graph[u]) { merge(x, u); } } } bool ok = true; for (int i = 0; i < k; ++i) { if (!visited[i] && color_counters[i] > 0) ok = false; } if (ok) { cout << "TAK\n"; } else { cout << "NIE\n"; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--) { solve(); } } |
English