利用并查集检测回路。
package ProgrammingContest;
import java.io.File;
import java.util.Scanner;
public class XPlosives_LA_3644 {
public int MAX = 100000;
public int[] P = new int[MAX];
//初始化并查集,每个元素为一个独立集合
public void init() {
for ( int i=0; i<MAX; i++ ) P[i]=i;
}
//找一个元素所属集合,并压缩路径
public int find(int x) {
if ( P[x] != x ) {
P[x] = find(P[x]);
}
return P[x];
}
//合并两个集合
public void merge(int x, int y) {
P[x] = y;
}
//利用并查集合检测回路
public static void main(String[] args) {
try {
int count = 0;
XPlosives_LA_3644 set = new XPlosives_LA_3644();
set.init();
Scanner scanner = new Scanner(new File(args[0]));
while ( scanner.hasNext() ) {
int x = scanner.nextInt();
while ( x != -1 ) {
int y = scanner.nextInt();
x = set.find(x);
y = set.find(y);
if ( x == y )
++count;
else
set.merge(x, y);
x = scanner.nextInt();
}
}
System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
}
}
}