PKU1611--并查集Kruskar算法实现最小生成树源码

来源:互联网 发布:淘宝apass会员是什么 编辑:程序博客网 时间:2024/05/18 11:14

     

    以下代码是使用java实现的pku1611,已经AC,算法具体可以参考并查集那篇。

    import java.util.Scanner;
    public class pku1611 {
            static int f[];
            static int r[];
            static void Make_Set(int n){
                for(int i=0;i                f[i]=i;
                    r[i]=1;
                }
            }
            static int Find_Set(int i){
                if(f[i]==i) return i;
                f[i]=Find_Set(f[i]);
                return f[i];
            }
            static void Union(int x,int y){
                int a=Find_Set(x);
                int b=Find_Set(y);
                if(a==b) return;
                if(r[a]>r[b]){

                    f[b]=a;
                    r[a]+=r[b];
                }
                else{
                    f[a]=b;
                    r[b]+=r[a];
                }
            }
            public static void main(String argvs[]){
                Scanner in=new Scanner(System.in);
                int m,n,i,first,num,j,t;
                while(in.hasNext()){
                    n=in.nextInt();
                    m=in.nextInt();
                    f=new int[n];
                    r=new int[n];
                    if(n==0&&m==0) break;
                    Make_Set(n); 
                    for(i=0;i<m;i++){
                        num=in.nextInt();
                        first=in.nextInt();
                        for(j=0;j<num-1;j++){
                            t=in.nextInt();
                            Union(first,t);
                        }
                    }
                    System.out.println(r[Find_Set(0)]);
                }
            }
    }