编程语言:Java
题目:
题解:并查集,要使用StreamTokenizer,不然会超时,另外要注意,find函数返回的值即可理解为下标也可理解为该下标指向的值(废话),但是不弄清楚的话,会很容易出问题的
结果:AC
import java.io.*;
import java.util.LinkedHashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static Scanner sc = new Scanner(new BufferedInputStream(System.in));
static int[] a;
public static void main(String[] args) throws IOException {
in.nextToken();
int n = (int) in.nval;
a = new int[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = i;
}
for (; ; ) {
in.nextToken();
String str1 = in.sval;
if (str1.equals("S")) break;
in.nextToken();
int x1= (int) in.nval;
in.nextToken();
int x2= (int) in.nval;
if (str1.equals("I")) {
if (find(x1) != find(x2))
union(x1, x2);
} else {
if (find(x1) == find(x2))
out.println("yes");
else
out.println("no");
}
}
Set<Integer> set = new LinkedHashSet<>();
for (int i = 1; i <= n; i++) {
if (!set.contains(find(a[i])))
set.add(find(i));
}
if (set.size() == 1)
out.println("The network is connected.");
else
out.println("There are " + set.size() + " components.");
out.flush();
}
private static void union(int x1, int x2) {
a[find(x1)] = find(x2);
}
private static int find(int i) {
if (a[i] == i) {
return i;
} else {
return a[i] = find(a[i]);
}
}
}