POJ2524-宗教问题-并查集-ACM
太难的搞不过,只能来写简单的了
POJ2524
无所不在的宗教
世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。
【输入格式】
可以输入多个测试用例(Case),每一个用例的第一行包含整数n和m,n表示学生编号(1-n),在接下来的m行中,每一行包含两个整数,对应信仰同一宗教的两名学生的编号,输入结束行为n = m=0。
【输出格式】
输出每一个测试用例中包含的学生信仰的最大宗教数量。
样例输入
10 9 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 10 4 2 3 4 5 4 8 5 8 0 0
样例输出
Case 1: 1 Case 2: 7
代码
1 #include <iostream> 2 using namespace std; 3 4 const int MAXN=50001; 5 int pa[MAXN]; 6 int rank[MAXN]; 7 8 void make_set(int x){ 9 pa[x] = x; 10 rank[x] = 0; 11 } 12 13 int find_set(int x){ 14 if(x != pa[x]){ 15 pa[x] = find_set(pa[x]); 16 } 17 return pa[x]; 18 } 19 20 void union_set(int x,int y){ 21 x = find_set(x); 22 y = find_set(y); 23 24 if(rank[x] > rank[y]){ 25 pa[y] = x; 26 } 27 else{ 28 pa[x] = y; 29 if(rank[x] == rank[y]){ 30 rank[y]++; 31 } 32 } 33 } 34 35 36 int main(void){ 37 int n,m,kase=0,count; 38 while(scanf("%d%d",&n,&m) == 2 && n!=0 && m!=0){ 39 int i; 40 for(i=1;i<=n;i++){ 41 make_set(i); 42 } 43 for(i=0;i<m;i++){ 44 int a,b; 45 scanf("%d%d",&a,&b); 46 union_set(a,b); 47 } 48 count = 0; 49 for(i=1;i<=n;i++){ 50 if(i == pa[i]){ 51 count++; 52 } 53 } 54 printf("Case %d: %d\n",++kase,count); 55 } 56 return 0; 57 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)