poj 2524 并查集的使用
题目我贴下链接吧:http://poj.org/problem?id=2524
此题主要考察 并查集的使用,关于啥叫并查集,请看前辈们的介绍:http://blog.csdn.net/dm_vincent/article/details/7655764
下面贴下我的代码吧:
package poj2524; import java.util.Scanner; public class Main { private static int []id;//节点数组 private static int []sz;//每个节点的高度 private static int count;//互不联通的组数 public Main(int N){//初始化 count =N; id = new int[N+1]; sz = new int[N+1]; for(int i=1;i<=N;i++){ id[i]=i;//默认节点为当前的i值 sz[i]=1;//初始化大小都为1 } } public static int count(){//返回结果 return count; } public static int find(int p){//查找节点,用到了压缩树的高度方法 while(p!=id[p]){ id[p]=id[id[p]]; p=id[p]; } return p; } public static void union(int p,int q){//连接不同节点 int i=find(p); int j=find(q); if(i==j) return; if(sz[i]<sz[j]){ //这里用到了构建最扁平的树的方法,使树的高度最小,方便find id[i]=j; sz[j]+=sz[i]; }else{ id[j]=i; sz[i]+=sz[j]; } count--; } public static void main(String[]args){ Scanner s = new Scanner(System.in); int side=0; while(true){ int n = s.nextInt(); int k = s.nextInt(); if(n==0&&k==0){ break; } new Main(n); int i=0; while(i<k){ union(s.nextInt(),s.nextInt()); i++; } System.out.println("Case "+ ++side +": "+count()); } } }
嗯!自己又进步了一点点!加油!