#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> graf;
vector<bool> odw;
vector<int> spojna, partia;
bool gud = true;
void dfs(int v, int s) {
odw[v] = true;
if (spojna[partia[v]] == -1 || spojna[partia[v]] == s) {
spojna[partia[v]] = s;
} else {
gud = false;
return;
}
for (int u : graf[v]) {
if (!odw[u]) dfs(u, s);
}
}
vector<bool> odw2;
void dfs2(int v, int c) {
odw2[v] = true;
for (int u : graf[v]) {
if (odw2[u] || partia[u] != c) continue;
dfs2(u, c);
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while (t--) {
int n, m, k;
cin >> n >> m >> k;
partia.resize(n+1);
for (int i = 1; i <= n; i++) {
cin >> partia[i];
}
graf.clear();
graf.resize(n+1);
int a, b;
for (int i = 0; i < m; i++) {
cin >> a >> b;
graf[a].push_back(b);
graf[b].push_back(a);
}
spojna.assign(k+1, -1);
odw.assign(n+1, false);
odw2.assign(n+1, false);
gud = true;
vector<int> sprawdzone(k+1, 0);
int s = 0;
for (int v = 1; v <= n; v++) {
if (!odw[v]) dfs(v, s++);
if (!odw2[v]) {
dfs2(v, partia[v]);
sprawdzone[partia[v]]++;
}
}
bool gud2 = false;
for (int i = 1; i <= k; i++) {
if (sprawdzone[i] == 1) {
gud2 = true;
break;
}
}
if (gud && gud2) {
cout << "TAK\n";
} else {
cout << "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 <bits/stdc++.h> using namespace std; vector<vector<int>> graf; vector<bool> odw; vector<int> spojna, partia; bool gud = true; void dfs(int v, int s) { odw[v] = true; if (spojna[partia[v]] == -1 || spojna[partia[v]] == s) { spojna[partia[v]] = s; } else { gud = false; return; } for (int u : graf[v]) { if (!odw[u]) dfs(u, s); } } vector<bool> odw2; void dfs2(int v, int c) { odw2[v] = true; for (int u : graf[v]) { if (odw2[u] || partia[u] != c) continue; dfs2(u, c); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) { int n, m, k; cin >> n >> m >> k; partia.resize(n+1); for (int i = 1; i <= n; i++) { cin >> partia[i]; } graf.clear(); graf.resize(n+1); int a, b; for (int i = 0; i < m; i++) { cin >> a >> b; graf[a].push_back(b); graf[b].push_back(a); } spojna.assign(k+1, -1); odw.assign(n+1, false); odw2.assign(n+1, false); gud = true; vector<int> sprawdzone(k+1, 0); int s = 0; for (int v = 1; v <= n; v++) { if (!odw[v]) dfs(v, s++); if (!odw2[v]) { dfs2(v, partia[v]); sprawdzone[partia[v]]++; } } bool gud2 = false; for (int i = 1; i <= k; i++) { if (sprawdzone[i] == 1) { gud2 = true; break; } } if (gud && gud2) { cout << "TAK\n"; } else { cout << "NIE\n"; } } return 0; } |
English