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

 

嗯!自己又进步了一点点!加油!

posted on 2014-08-19 17:37  asonga  阅读(143)  评论(0编辑  收藏  举报

导航