当前位置:编程学习 > C/C++ >>

HDU1856(More is better)—并查集+树

[java] 
package D0813; 
/*
 * 题目大意:mr wang把一群小孩放在一个房间里,这群小孩有些之间是朋友,
 * mr wang每次要从小孩中选出一些离开这个房间,问你最后留下的最多有几个小孩(小孩之间必须是朋友关系,
 * 可以使直接的也可以是节间的),给出直接的朋友关系,要你确定最的留下的小孩子的数目
 * 思路:并查集》找出集合数最多的就是结果
 * */ 
import java.io.*; 
public class HDU1856 { 
    static int[]set; 
    static int[]height ; 
    static int[]boy;//节点数。 
    static int max; 
    public static void main(String[] args) throws IOException { 
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); 
        while(st.nextToken()!=StreamTokenizer.TT_EOF){ 
            int n = (int)st.nval; 
            init(n); 
            max = 1;//一定要注意这个地方,不能使0.因为最后至少可以留下一个小孩 
            for(int i = 0;i<n;i++){ 
                st.nextToken(); 
                int s = (int)st.nval; 
                st.nextToken(); 
                int e = (int)st.nval; 
                merge(s,e); 
            } 
            System.out.println(max); 
        } 
    } 
 
    public static void init(int n){ 
        boy = new int[2*n+1]; 
        height = new int[2*n+1]; 
        set = new int[2*n+1]; 
        for(int i = 1;i<=2*n;i++){ 
            set[i] = i; 
            height[i] = 1; 
            boy[i] = 1; 
        } 
    } 
    public static int find(int x){ 
        int son,temp ; 
        son = x; 
        while(x!=set[x]) 
            x = set[x]; 
        //路径压缩,可以不压缩 
        while(son!=x){ 
            temp = set[son]; 
            set[son] = x; 
            son = temp; 
        } 
        return x; 
    } 
    public static void merge(int a,int b){ 
        a = find(a); 
        b = find(b); 
        if(a!=b){ 
            if(height[a]>height[b]){ 
                set[b] = a; 
                boy[a]+= boy[b]; 
                max = Math.max(max, boy[a]); 
            } 
            else if(height[a]<height[b]){ 
                set[a] = b; 
                boy[b]+= boy[a]; 
                max = Math.max(max, boy[b]); 
            } 
            else{ 
                set[b] = a; 
                height[a]++; 
                boy[a]+= boy[b]; 
                max = Math.max(max, boy[a]); 
            } 
        } 
    } 

 


作者;lhfight
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,