程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU1856(More is better)—並查集+樹

HDU1856(More is better)—並查集+樹

編輯:C++入門知識

[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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved