您的位置:首页 > 编程语言 > Java开发

ACM HDOJ 1232 (畅通工程 )

2014-01-12 16:32 302 查看
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1232

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
while (true) {
int pointsNumber = Integer.parseInt(scn.next());
if (0 == pointsNumber) {
break;
}
DisjointSet disjointSet = new DisjointSet(pointsNumber);
int relationNumber = Integer.parseInt(scn.next());
while (0 <= --relationNumber) {
int x = Integer.parseInt(scn.next()) - 1;
int y = Integer.parseInt(scn.next()) - 1;
disjointSet.union(x, y);
}
System.out.println(disjointSet.calculateSetNumber() - 1);
}
scn.close();
}

}

class DisjointSet {

private int pointsNumber;
private int[] flag;

private int find(int r) {
while (r != flag[r]) {
r = flag[r];
}
return r;
}

public DisjointSet(int pointsNumber) {
this.pointsNumber = pointsNumber;
flag = new int[pointsNumber];
for (int i = 0; i < pointsNumber; ++i) {
flag[i] = i;
}
}

public int calculateSetNumber() {
int count = 0;
for (int i = 0; i < pointsNumber; ++i) {
if (flag[i] == i) {
++count;
}
}
return count;
}

public void union(int x, int y) {
int xRoot = find(x);
int yRoot = find(y);
if (xRoot != yRoot) {
flag[yRoot] = xRoot;
}
}

}

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