#include <cstdlib>
#include <bitset>
#include <functional>
#include <utility>
#include <chrono>
#include <tuple>
#include <new>
#include <memory>
#include <climits>
#include <cfloat>
#include <cinttypes>
#include <exception>
#include <string>
#include <array>
#include <vector>
#include <deque>
#include <list>
#include <forward_list>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <stack>
#include <queue>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <complex>
#include <valarray>
#include <ios>
#include <istream>
#include <ostream>
#include <iostream>
#include <fstream>
#include <streambuf>
#include <cstdio>
#include <thread>
#include <random>
// #include <bits/stdc++.h>
using namespace std;
int t;
int n, m, k;
int przynaleznosc[100005];
bool wyrzucone[100005], odwiedzone[100005];
vector<int> graf[100005], partie[100005];
vector<int> kolejnosc;
bool udalo_sie;
void DFS(int x)
{
odwiedzone[x] = 1;
for (auto sasiad : graf[x])
{
if (odwiedzone[sasiad] || wyrzucone[sasiad])
continue;
DFS(sasiad);
}
}
int main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
cin >> t;
while (t--)
{
udalo_sie = 0;
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
graf[i].clear();
kolejnosc.clear();
for (int i = 1; i <= k; i++)
{
partie[i].clear();
kolejnosc.push_back(i);
}
for (int i = 1; i <= n; i++)
{
cin >> przynaleznosc[i];
partie[przynaleznosc[i]].push_back(i);
}
for (int i = 1; i <= m; i++)
{
int a, b;
cin >> a >> b;
graf[a].push_back(b);
graf[b].push_back(a);
}
do
{
bool czy_dziala = 1;
fill(wyrzucone, wyrzucone + n + 1, 0);
for (auto odwiedzam : kolejnosc)
{
if (partie[odwiedzam].size() == 0)
continue;
int pocz = partie[odwiedzam][0];
fill(odwiedzone, odwiedzone + n + 1, 0);
DFS(pocz);
for (auto i : partie[odwiedzam])
{
if (!odwiedzone[i])
{
czy_dziala = 0;
break;
}
wyrzucone[i] = 1;
}
if (!czy_dziala)
break;
}
if (czy_dziala)
{
udalo_sie = 1;
break;
}
} while (next_permutation(kolejnosc.begin(), kolejnosc.end()));
if (udalo_sie)
cout << "TAK\n";
else
cout << "NIE\n";
}
}
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 125 126 127 128 129 130 131 132 133 134 | #include <cstdlib> #include <bitset> #include <functional> #include <utility> #include <chrono> #include <tuple> #include <new> #include <memory> #include <climits> #include <cfloat> #include <cinttypes> #include <exception> #include <string> #include <array> #include <vector> #include <deque> #include <list> #include <forward_list> #include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <stack> #include <queue> #include <algorithm> #include <iterator> #include <cmath> #include <complex> #include <valarray> #include <ios> #include <istream> #include <ostream> #include <iostream> #include <fstream> #include <streambuf> #include <cstdio> #include <thread> #include <random> // #include <bits/stdc++.h> using namespace std; int t; int n, m, k; int przynaleznosc[100005]; bool wyrzucone[100005], odwiedzone[100005]; vector<int> graf[100005], partie[100005]; vector<int> kolejnosc; bool udalo_sie; void DFS(int x) { odwiedzone[x] = 1; for (auto sasiad : graf[x]) { if (odwiedzone[sasiad] || wyrzucone[sasiad]) continue; DFS(sasiad); } } int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> t; while (t--) { udalo_sie = 0; cin >> n >> m >> k; for (int i = 1; i <= n; i++) graf[i].clear(); kolejnosc.clear(); for (int i = 1; i <= k; i++) { partie[i].clear(); kolejnosc.push_back(i); } for (int i = 1; i <= n; i++) { cin >> przynaleznosc[i]; partie[przynaleznosc[i]].push_back(i); } for (int i = 1; i <= m; i++) { int a, b; cin >> a >> b; graf[a].push_back(b); graf[b].push_back(a); } do { bool czy_dziala = 1; fill(wyrzucone, wyrzucone + n + 1, 0); for (auto odwiedzam : kolejnosc) { if (partie[odwiedzam].size() == 0) continue; int pocz = partie[odwiedzam][0]; fill(odwiedzone, odwiedzone + n + 1, 0); DFS(pocz); for (auto i : partie[odwiedzam]) { if (!odwiedzone[i]) { czy_dziala = 0; break; } wyrzucone[i] = 1; } if (!czy_dziala) break; } if (czy_dziala) { udalo_sie = 1; break; } } while (next_permutation(kolejnosc.begin(), kolejnosc.end())); if (udalo_sie) cout << "TAK\n"; else cout << "NIE\n"; } } |
English