dengxinyi %!s(int64=6) %!d(string=hai) anos
pai
achega
d0b9e3d14e
Modificáronse 2 ficheiros con 133 adicións e 0 borrados
  1. 72 0
      poj/1182.food-chain/main.cc
  2. 61 0
      poj/2492.a-bugs-life/main.cc

+ 72 - 0
poj/1182.food-chain/main.cc

@@ -0,0 +1,72 @@
+#include <cstdio>
+#include <cstring>
+
+using namespace std;
+
+const int N = 50000;
+
+struct UF {
+  int id[3 * N + 1];
+  int sz[3 * N + 1];
+};
+
+UF 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 n, k, d, x, y;
+  scanf("%d %d", &n, &k);
+  memset(uf.sz, 0, sizeof(uf.sz));
+  for (int i = 1; i <= n; i++) {
+    uf.id[i] = i;
+    uf.id[i + N] = i + N;
+    uf.id[i + 2 * N] = i + 2 * N;
+  }
+  int ans = 0;
+  for (int i = 0; i < k; i++) {
+    scanf("%d %d %d", &d, &x, &y);
+    if (x < 1 || n < x || y < 1 || n < y) {
+      ans++;
+      continue;
+    }
+    if (d == 1) {
+      if (is_join(x, y + N) || is_join(x, y + 2 * N)) {
+        ans++;
+        continue;
+      }
+      join(x, y);
+      join(x + N, y + N);
+      join(x + 2 * N, y + 2 * N);
+    } else {
+      if (is_join(x, y) || is_join(x, y + 2 * N)) {
+        ans++;
+        continue;
+      }
+      join(x, y + N);
+      join(x + N, y + 2 * N);
+      join(x + 2 * N, y);
+    }
+  }
+  printf("%d\n", ans);
+  return 0;
+}

+ 61 - 0
poj/2492.a-bugs-life/main.cc

@@ -0,0 +1,61 @@
+#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;
+}