#include <vector>
#include <iostream>
using namespace std;
struct DSU {
vector<int> parent, sz;
DSU(int n) {
parent.resize(n+1);
sz.resize(n+1, 1);
for (int i = 1; i <= n; i++)
parent[i] = i;
}
int find(int v) {
if (v == parent[v]) return v;
return parent[v] = find(parent[v]);
}
void unite(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
if (sz[a] < sz[b]) swap(a, b);
parent[b] = a;
sz[a] += sz[b];
}
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n, m, k;
cin >> n >> m >> k;
vector<int> a(n+1);
for (int i = 1; i <= n; i++)
cin >> a[i];
vector<vector<int>> adj(n+1);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<vector<int>> by_party(k+1);
for (int i = 1; i <= n; i++) {
by_party[a[i]].push_back(i);
}
DSU dsu(n);
vector<bool> active(n+1, false);
bool ok = true;
for (int p = k; p >= 1; p--) {
for (int v : by_party[p]) {
active[v] = true;
for (int u : adj[v]) {
if (active[u]) {
dsu.unite(u, v);
}
}
}
int root = -1;
for (int v : by_party[p]) {
if (root == -1)
root = dsu.find(v);
else if (dsu.find(v) != root) {
ok = false;
break;
}
}
if (!ok) break;
}
cout << (ok ? "TAK\n" : "NIE\n");
}
return 0;
}
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 | #include <vector> #include <iostream> using namespace std; struct DSU { vector<int> parent, sz; DSU(int n) { parent.resize(n+1); sz.resize(n+1, 1); for (int i = 1; i <= n; i++) parent[i] = i; } int find(int v) { if (v == parent[v]) return v; return parent[v] = find(parent[v]); } void unite(int a, int b) { a = find(a); b = find(b); if (a != b) { if (sz[a] < sz[b]) swap(a, b); parent[b] = a; sz[a] += sz[b]; } } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int n, m, k; cin >> n >> m >> k; vector<int> a(n+1); for (int i = 1; i <= n; i++) cin >> a[i]; vector<vector<int>> adj(n+1); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } vector<vector<int>> by_party(k+1); for (int i = 1; i <= n; i++) { by_party[a[i]].push_back(i); } DSU dsu(n); vector<bool> active(n+1, false); bool ok = true; for (int p = k; p >= 1; p--) { for (int v : by_party[p]) { active[v] = true; for (int u : adj[v]) { if (active[u]) { dsu.unite(u, v); } } } int root = -1; for (int v : by_party[p]) { if (root == -1) root = dsu.find(v); else if (dsu.find(v) != root) { ok = false; break; } } if (!ok) break; } cout << (ok ? "TAK\n" : "NIE\n"); } return 0; } |
English