某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
思路:找到有几个点指向的是自己,如果道路全部连通,就只有一个点指向自己,就是所有城市的终点(头)。
如果有两个点指向了自己,就需要再修一条路,将这两块区域的城市连通起来;
如果有三个点指向了自己,就需要再修两条路,将这三块区域的城市连通起来,即sum-1。
package package08;
import java.util.Scanner;
public class Main {
static int[] aa = new int[1001];
public static void main(String[] args) {
while(true) {
init();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
if(n == 0) break;
int m = scanner.nextInt();
for(int i = 0;i < m;i ++) {
int x = scanner.nextInt();
int y = scanner.nextInt();
merge(x,y);
}
int sum = 0;
for(int i = 1;i <= n;i ++) {
if(find(i) == i) {
sum ++;
}
}
System.out.println(sum - 1);
}
}
public static void init() {
for(int i = 0;i < aa.length;i ++) {
aa[i] = i;
}
}
public static int find(int x) {
while(aa[x] != x) {
x = aa[x];
}
return x;
}
public static void merge(int x,int y) {
int findX = find(x);
int findY = find(y);
if(findX > findY) {
aa[x] = findY;
}else {
aa[y] = findX;
}
}
}