• 1107 Social Clusters (并查集)


    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<stdio.h> // 以防万一,使用scanf时加上这个头文件 
    using namespace std;
    int n;
    vector<int>father,isRoot;
    int course[1001] = {0};//vector可以实现动态设置数组大小,但是效率比数组低
    int FindFather(int x){
    	int a = x;
    	while(x != father[x]){
    		x = father[x];
    	}
    	while(a != father[a]){ //路径压缩
    		int z = a;
    		a = father[a];
    		father[z] = x;
    	}
    	return x;
    }
    void Union(int a,int b){
    	int fa = FindFather(a);
    	int fb = FindFather(b);
    	if(fa != fb)  father[fa] = fb;
    }
    bool cmp(int &a,int &b){
    	return a>b;
    }
    int main()
    {
    	cin>>n;
    	father.resize(n+1),isRoot.resize(n+1);
    	for(int i=1;i<=n;i++)father[i] = i;
    	for(int i=1;i<=n;i++){
    		int k ;
    		scanf("%d:",&k);
    		for(int j =0;j<k;j++){
    			int t;
    			cin>>t;
    			if(0 == course[t])
    			course[t] = i;
    			Union(i,FindFather(course[t]));
    		} 
    	}
    	for(int i=1;i<=n;i++){
    		isRoot[FindFather(i)]++;
    	}
    	sort(isRoot.begin(),isRoot.end(),cmp);
    	int cnt=0;
    	while(isRoot[cnt++]);//下表从零开始,cnt最后的值会比非零的下标大2
    	printf("%d
    ",cnt-1);
    	for(int i=0;i<cnt-1;i++){
    		printf("%d",isRoot[i]);
    		if(i !=cnt-2) printf(" ");//printf("%d%s",isRoot[i],i == cnt-2?"":" ")三目运算符的效率比较低,在汇编的时候比对应的if-else多一条指令
    	} 
    	return 0;
    }
    

      

  • 相关阅读:
    Centos6.6部署Redis集群
    贪心算法解+-字符串
    水题记录--排序
    项目总结之HashMap问题
    水题记录--大整数求阶乘
    水题记录--组合数
    水题记录-成绩转换
    水题记录
    简单排序
    数组
  • 原文地址:https://www.cnblogs.com/zxzmnh/p/12035784.html
Copyright © 2020-2023  润新知