设为首页 加入收藏

TOP

CodeForces-Learning Languages
2015-11-21 01:02:09 来源: 作者: 【 】 浏览:1
Tags:CodeForces-Learning Languages
#include 
   
     #include 
    
      #include 
     
       /* 这道题目考查并查集,特别注意每个人都不会语言的情况,此时结果为n。 */ int father[105]; int lang[105][105]; int flag[105]; int set[105]; int find(int x){ int r = x; while(father[r]!=r) r=father[r]; //压缩 int i = x,j; while(father[i]!=r){ j=father[i]; father[i]=r; i=j; } return r; } void merge(int x,int y){ int fx = find(x); int fy = find(y); if (fx!=fy) father[fx]=fy; } int main(){ freopen("0input.txt","r",stdin); int n,m,k,p,res,flag1=0; while(scanf("%d%d",&n,&m)!=EOF){ //初始化 flag1=0; memset(flag,0,sizeof(flag)); memset(lang,0,sizeof(lang)); memset(set,0,sizeof(set)); for (int i = 1; i <= n; ++i) father[i]=i; //读入数据 for (int i = 1; i <= n; ++i) { scanf("%d",&k); if (k!=0) { flag[i]=1; for (int j = 1; j <= k; ++j) { scanf("%d",&p); lang[p][i]=1; } } } //构造并查集 for (int i = 1; i <=m; ++i) { int j,fa,fb; for (j = 1; j <= n; ++j) { if (lang[i][j]){ fa = find(j); //printf("fa:%d\n",fa ); break; } } for (j=j+1; j <= n; ++j) { if (lang[i][j]) { fb=find(j); //printf("fa:%dfb:%d\n",fa,fb); merge(fa,fb); } } } for (int i = 1; i <= n; ++i) { //printf("flag:%d ",flag[i]); if (flag[i]){ flag1=1; break; } } if (!flag1) { printf("%d\n",n); }else{ //统计将员工分成几类 int fc; for (int i = 1; i <=n; ++i) { fc = find(i); set[fc]++; } res =0; for (int i = 1; i <= n; ++i) { if (set[i]>=1) res++; } printf("%d\n",res-1); } } return 0; }
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDOJ 5229 ZCC loves strings 下一篇BestCoder Round #41 -- (A,B)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: