因为两个公司都是同性,所以能看成两边单独的并查集,只要0移位到1e5的位置,就解决负数的情况。然后只要看一下1e5(±)1相同的根就可以判断有多少个人和他们认识。
当然小明小红也算人啊,所以默认是1往上,别漏算人!
。
import java.util.Scanner;
public class Main
{
static int dp[];
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
int n, m, p, q;
n = sc.nextInt();
m = sc.nextInt();
p = sc.nextInt();
q = sc.nextInt();
dp = new int[20005];
for (int i = 0; i < dp.length; i++) {
dp[i] = i;
}
for (int i = 0; i < p; i++) {
int u = sc.nextInt() + 10000;
int v = sc.nextInt() + 10000;
if (u != v)
union(u, v);
}
for (int i = 0; i < q; i++) {
int u = sc.nextInt() + 10000;
int v = sc.nextInt() + 10000;
if (u != v)
union(u, v);
}
int left, right;
left = 0;
right = 0;
for (int i = 1; i < 20005; i++) {
if (find(dp[i]) == find(dp[10000 - 1]) && i < 10000 - 1)
left++;
else if (find(dp[i]) == find(dp[10000 + 1]) && i > 10000 + 1)
right++;
}
System.out.println(Math.min(left+1, right+1));
}
static int find(int x)
{
int g=x;
while (x != dp[x]) {
x = dp[x];
}
while(g!=x) {
int t=dp[g];
dp[g]=x;
g=dp[g];
}
return x;
}
static void union(int x, int y)
{
int l = find(x);
int r = find(y);
dp[l] = r;
}
}