#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <set>
#include <unordered_set>
#include <unordered_map>
using namespace std;
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;
#define ff first
#define ss second
const int MAXN = 1e5 + 6;
vi graf[MAXN];
int tab[MAXN];
int ileK[MAXN];
vi ww[MAXN];
bool odw[MAXN];
int dfs(int v, int k) {
odw[v] = 1;
int w = 0;
for (int s: graf[v]) {
if ((tab[s] == 0 || tab[s] == k) && !odw[s]) w += dfs(s, k);
}
if (tab[v] == k) w++;
return w;
}
void solve() {
int n, m, k;
cin >> n >> m >> k;
for (int i = 0; i <= n; i++) {
graf[i].clear();
}
for (int i = 0; i <= k; i++) {
ileK[i] = 0;
ww[i].clear();
}
for (int i = 1; i <= n; i++) {
cin >> tab[i];
ileK[tab[i]]++;
ww[tab[i]].push_back(i);
}
for (int i = 1; i <= n; i++) {
graf[i].clear();
}
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
graf[a].push_back(b);
graf[b].push_back(a);
}
// cout << secik.size() << ' ' << iles << ' ' << git << '\n';
int ile0 = 0, popile0 = -1;
while (ile0 > popile0) {
popile0 = ile0;
for (int i = 1; i <= n; i++) {
if (tab[i] != 0) {
for (int j = 0; j <= n; j++) odw[j] = 0;
if (dfs(i, tab[i]) == ileK[tab[i]]) {
ile0 += ileK[tab[i]];
for (int v : ww[tab[i]]) tab[v] = 0;
}
}
}
}
if (ile0 != n) cout << "NIE\n";
else cout << "TAK\n";
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int q;
cin >> q;
while (q--) {
solve();
}
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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <iomanip> #include <set> #include <unordered_set> #include <unordered_map> using namespace std; using ll = long long; using vi = vector<int>; using pii = pair<int, int>; #define ff first #define ss second const int MAXN = 1e5 + 6; vi graf[MAXN]; int tab[MAXN]; int ileK[MAXN]; vi ww[MAXN]; bool odw[MAXN]; int dfs(int v, int k) { odw[v] = 1; int w = 0; for (int s: graf[v]) { if ((tab[s] == 0 || tab[s] == k) && !odw[s]) w += dfs(s, k); } if (tab[v] == k) w++; return w; } void solve() { int n, m, k; cin >> n >> m >> k; for (int i = 0; i <= n; i++) { graf[i].clear(); } for (int i = 0; i <= k; i++) { ileK[i] = 0; ww[i].clear(); } for (int i = 1; i <= n; i++) { cin >> tab[i]; ileK[tab[i]]++; ww[tab[i]].push_back(i); } for (int i = 1; i <= n; i++) { graf[i].clear(); } for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; graf[a].push_back(b); graf[b].push_back(a); } // cout << secik.size() << ' ' << iles << ' ' << git << '\n'; int ile0 = 0, popile0 = -1; while (ile0 > popile0) { popile0 = ile0; for (int i = 1; i <= n; i++) { if (tab[i] != 0) { for (int j = 0; j <= n; j++) odw[j] = 0; if (dfs(i, tab[i]) == ileK[tab[i]]) { ile0 += ileK[tab[i]]; for (int v : ww[tab[i]]) tab[v] = 0; } } } } if (ile0 != n) cout << "NIE\n"; else cout << "TAK\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int q; cin >> q; while (q--) { solve(); } return 0; } |
English