12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int N = 2000;
- struct UF {
- int id[2 * N + 1];
- int sz[2 * N + 1];
- } uf;
- int find(int i) {
- if (i == uf.id[i]) return i;
- int j = find(uf.id[i]);
- uf.id[i] = j;
- return j;
- }
- bool is_join(int i, int j) { return find(i) == find(j); }
- void join(int i, int j) {
- i = find(i);
- j = find(j);
- if (i == j) return;
- if (uf.sz[i] < uf.sz[j]) {
- uf.id[i] = j;
- } else {
- if (uf.sz[i] == uf.sz[j]) uf.sz[i]++;
- uf.id[j] = i;
- }
- }
- int main() {
- int S;
- scanf("%d", &S);
- for (int s = 1, n, k; s <= S; s++) {
- scanf("%d %d", &n, &k);
- for (int i = 1; i <= n; i++) {
- uf.id[i] = i;
- uf.id[i + N] = i + N;
- }
- memset(uf.sz, 0, sizeof(uf.sz));
- bool is_find = false;
- for (int i = 0, x, y; i < k; i++) {
- scanf("%d %d", &x, &y);
- if (is_find) continue;
- if (is_join(x, y)) {
- is_find = true;
- continue;
- }
- join(x, y + N);
- join(y, x + N);
- }
- if (is_find)
- printf("Scenario #%d:\nSuspicious bugs found!\n\n", s);
- else
- printf("Scenario #%d:\nNo suspicious bugs found!\n\n", s);
- }
- return 0;
- }
|