#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> par;
par ost[100009];
vector<int> graf[100009], nodes[100009];
int uf[100009], col[100009], comp[100009];
queue<int> q;
int find(int u)
{
return (uf[u] == u ? u : uf[u] = find(uf[u]));
}
void Union(int u, int v)
{
uf[find(u)] = find(v);
}
void solve()
{
int n, m, k, a, b, c, cnt = 0;
cin>>n>>m>>k;
while(!q.empty()) q.pop();
for(int i=1; i<=k; i++) {
comp[i] = 0;
nodes[i].clear();
ost[i] = {0, 0};
}
for(int i=1; i<=n; i++) {
graf[i].clear();
uf[i] = i;
cin>>col[i];
comp[col[i]]++;
if(comp[col[i]] == 1) cnt++;
nodes[col[i]].push_back(i);
}
for(int i=1; i<=m; i++) {
cin>>a>>b;
graf[a].push_back(b);
graf[b].push_back(a);
if(col[a] == col[b] && find(a) != find(b)) {
Union(a, b);
comp[col[a]]--;
}
}
for(int i=1; i<=k; i++) {
if(comp[i] == 1) {
q.push(i);
cnt--;
}
}
while(!q.empty()) {
a = q.front();
q.pop();
for(int i=0; i<nodes[a].size(); i++) {
b = nodes[a][i];
for(int j=0; j<graf[b].size(); j++) {
c = graf[b][j];
if(ost[col[c]].second == a) {
if(find(c) == find(ost[col[c]].first)) continue;
Union(c, ost[col[c]].first);
comp[col[c]]--;
if(comp[col[c]] == 1) {
q.push(col[c]);
cnt--;
}
}
else ost[col[c]] = {c, a};
}
}
}
if(cnt == 0) cout<<"TAK\n";
else cout<<"NIE\n";
return;
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
int t;
cin>>t;
while(t--) 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 | #include<bits/stdc++.h> using namespace std; typedef pair<int, int> par; par ost[100009]; vector<int> graf[100009], nodes[100009]; int uf[100009], col[100009], comp[100009]; queue<int> q; int find(int u) { return (uf[u] == u ? u : uf[u] = find(uf[u])); } void Union(int u, int v) { uf[find(u)] = find(v); } void solve() { int n, m, k, a, b, c, cnt = 0; cin>>n>>m>>k; while(!q.empty()) q.pop(); for(int i=1; i<=k; i++) { comp[i] = 0; nodes[i].clear(); ost[i] = {0, 0}; } for(int i=1; i<=n; i++) { graf[i].clear(); uf[i] = i; cin>>col[i]; comp[col[i]]++; if(comp[col[i]] == 1) cnt++; nodes[col[i]].push_back(i); } for(int i=1; i<=m; i++) { cin>>a>>b; graf[a].push_back(b); graf[b].push_back(a); if(col[a] == col[b] && find(a) != find(b)) { Union(a, b); comp[col[a]]--; } } for(int i=1; i<=k; i++) { if(comp[i] == 1) { q.push(i); cnt--; } } while(!q.empty()) { a = q.front(); q.pop(); for(int i=0; i<nodes[a].size(); i++) { b = nodes[a][i]; for(int j=0; j<graf[b].size(); j++) { c = graf[b][j]; if(ost[col[c]].second == a) { if(find(c) == find(ost[col[c]].first)) continue; Union(c, ost[col[c]].first); comp[col[c]]--; if(comp[col[c]] == 1) { q.push(col[c]); cnt--; } } else ost[col[c]] = {c, a}; } } } if(cnt == 0) cout<<"TAK\n"; else cout<<"NIE\n"; return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin>>t; while(t--) solve(); return 0; } |
English