某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2998
分析:很简单的一道并查集问题,只需要利用并查集求出有几个连通分量,然后减去一即可(不用解释了吧)上代码:
import java.util.*; public class Main { static Scanner in = new Scanner(System.in); static int n,m,cnt; static int[] f = new int[1005]; static void init(){ cnt=0; for (int i = 1; i <= 1000; i++) { f[i]=i; } } static int find(int x){ if(f[x]==x) return x; else return f[x]=find(f[x]); } static void merge(int x,int y){ int t1 = find(x); int t2 = find(y); if(t1!=t2) f[t1]=t2; } public static void main(String[] args) { while(in.hasNext()){ init(); n = in.nextInt(); m = in.nextInt(); if(n==0) break; if(m==0) System.out.println(n-1); else{ int x,y; for (int i = 0; i < m; i++) { x = in.nextInt(); y = in.nextInt(); merge(x,y); } for (int i = 1; i <= n; i++) { if(f[i]==i) cnt++; } System.out.println(cnt-1); } } } }