您的位置:首页 > 其它

X-Plosives问题, LA 3644, 并查集算法

2012-11-15 22:14 323 查看
利用并查集检测回路。

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();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: