#include <bits/stdc++.h>
using namespace std;
const int MX = 1e5+9;
vector<int>graph[MX], col[MX];
unordered_map<int, int>umap[MX];
queue<int>Q;
int rep0[MX], rep[MX], C[MX], color[MX];
bool vis[MX], ex[MX];
int get(){
int x = 0;
char c = getchar_unlocked();
while(c < '0' || c > '9') c = getchar_unlocked();
while(c >= '0' && c <= '9'){
x = x*10+c-'0';
c = getchar_unlocked();
}
return x;
}
int F0(int x){
if(x != rep0[x]) rep0[x] = F0(rep0[x]);
return rep0[x];
}
int F(int x){
if(x != rep[x]) rep[x] = F(rep[x]);
return rep[x];
}
void U0(int x, int y){
int X = F0(x), Y = F0(y);
if(X != Y) rep0[Y] = X;
}
void U(int x, int y){
int X = F(x), Y = F(y);
if(X == Y) return;
if(umap[X].size() < umap[Y].size()) swap(X, Y);
rep[Y] = X;
for(auto [i, val] : umap[Y]){
val = F0(val);
if(umap[X][i]){
int bal = F0(umap[X][i]);
if(bal != val){
U0(bal, val);
color[i]--;
if(color[i] == 1 && !vis[i]){
Q.push(i);
vis[i] = 1;
}
}
umap[X][i] = F0(bal);
} else {
umap[X][i] = val;
}
}
umap[Y].clear();
}
int main(){
int t = get();
while(t--){
int n = get(), m = get(), k = get();
set<int>todel;
for(int i = 1; i <= n; ++i){
rep0[i] = rep[i] = i;
ex[i] = 0;
graph[i].clear();
umap[i].clear();
C[i] = get();
if(!vis[C[i]]){
col[C[i]].clear();
color[C[i]] = 0;
vis[C[i]] = 1;
todel.insert(C[i]);
}
col[C[i]].push_back(i);
}
for(int x : todel) vis[x] = 0;
for(int i = 1; i <= m; ++i){
int a = get(), b = get();
graph[a].push_back(b);
graph[b].push_back(a);
}
for(int a = 1; a <= n; ++a){
for(int b : graph[a]){
if(C[a] == C[b]) U0(a, b);
}
}
for(int i = 1; i <= n; ++i){
if(F0(i) == i) color[C[i]]++;
}
for(int x : todel){
if(color[x] == 1){
Q.push(x);
vis[x] = 1;
}
}
int res = 0;
while(Q.size()){
int x = Q.front(); Q.pop(); res++;
for(int a : col[x]){
ex[a] = 1;
for(int b : graph[a]){
if(ex[b]) continue;
int val = F0(b);
if(umap[a][C[b]]){
int bal = F0(umap[a][C[b]]);
if(bal != val){
U0(bal, val);
color[C[b]]--;
if(color[C[b]] == 1 && !vis[C[b]]){
Q.push(C[b]);
vis[C[b]] = 1;
}
}
umap[a][C[b]] = F0(val);
} else{
umap[a][C[b]] = val;
}
}
for(int b : graph[a]) if(ex[b]) U(a, b);
}
}
cout << (res == todel.size() ? "TAK\n" : "NIE\n");
for(int x : todel) vis[x] = 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 113 114 115 116 117 118 119 120 121 122 123 124 | #include <bits/stdc++.h> using namespace std; const int MX = 1e5+9; vector<int>graph[MX], col[MX]; unordered_map<int, int>umap[MX]; queue<int>Q; int rep0[MX], rep[MX], C[MX], color[MX]; bool vis[MX], ex[MX]; int get(){ int x = 0; char c = getchar_unlocked(); while(c < '0' || c > '9') c = getchar_unlocked(); while(c >= '0' && c <= '9'){ x = x*10+c-'0'; c = getchar_unlocked(); } return x; } int F0(int x){ if(x != rep0[x]) rep0[x] = F0(rep0[x]); return rep0[x]; } int F(int x){ if(x != rep[x]) rep[x] = F(rep[x]); return rep[x]; } void U0(int x, int y){ int X = F0(x), Y = F0(y); if(X != Y) rep0[Y] = X; } void U(int x, int y){ int X = F(x), Y = F(y); if(X == Y) return; if(umap[X].size() < umap[Y].size()) swap(X, Y); rep[Y] = X; for(auto [i, val] : umap[Y]){ val = F0(val); if(umap[X][i]){ int bal = F0(umap[X][i]); if(bal != val){ U0(bal, val); color[i]--; if(color[i] == 1 && !vis[i]){ Q.push(i); vis[i] = 1; } } umap[X][i] = F0(bal); } else { umap[X][i] = val; } } umap[Y].clear(); } int main(){ int t = get(); while(t--){ int n = get(), m = get(), k = get(); set<int>todel; for(int i = 1; i <= n; ++i){ rep0[i] = rep[i] = i; ex[i] = 0; graph[i].clear(); umap[i].clear(); C[i] = get(); if(!vis[C[i]]){ col[C[i]].clear(); color[C[i]] = 0; vis[C[i]] = 1; todel.insert(C[i]); } col[C[i]].push_back(i); } for(int x : todel) vis[x] = 0; for(int i = 1; i <= m; ++i){ int a = get(), b = get(); graph[a].push_back(b); graph[b].push_back(a); } for(int a = 1; a <= n; ++a){ for(int b : graph[a]){ if(C[a] == C[b]) U0(a, b); } } for(int i = 1; i <= n; ++i){ if(F0(i) == i) color[C[i]]++; } for(int x : todel){ if(color[x] == 1){ Q.push(x); vis[x] = 1; } } int res = 0; while(Q.size()){ int x = Q.front(); Q.pop(); res++; for(int a : col[x]){ ex[a] = 1; for(int b : graph[a]){ if(ex[b]) continue; int val = F0(b); if(umap[a][C[b]]){ int bal = F0(umap[a][C[b]]); if(bal != val){ U0(bal, val); color[C[b]]--; if(color[C[b]] == 1 && !vis[C[b]]){ Q.push(C[b]); vis[C[b]] = 1; } } umap[a][C[b]] = F0(val); } else{ umap[a][C[b]] = val; } } for(int b : graph[a]) if(ex[b]) U(a, b); } } cout << (res == todel.size() ? "TAK\n" : "NIE\n"); for(int x : todel) vis[x] = 0; } } |
English