poj 1611 The Suspects
题目链接:http://poj.org/problem?id=1611
题目类型:简单并查集问题,需要注意的是在某些细节的输入方式的处理可能会使题目的难度降低
因为题目说
最初学生 0 在所有情况下都被识别为嫌疑人,所以说查找集合和0号是不是同一根
所以说在处理完成之后用所有集合和0号集合比较一下就可以了。
几个细节的地方:
题目的输入和正常的输入两个变量x,y不同,所以说我们可以在处理的时候采取一些巧妙的方法来避免一些麻烦:
scanf ("%d", &x); //输入人员数 scanf ("%d", &tmp);//输入第一个人 for (int j = 1; j < x; j++) { scanf ("%d", &y);//后序的和第一个放在同一个集合中 union_set(tmp, y); } }
我们可以在输入人数之后先输入第一个人,然后输入后序人员的时候在将其与第一个人放在同一个集合中处理,然后在进行集合处理就可以了
参考代码:
1 #include <iostream>//poj1611 2 #include <cstdio> 3 using namespace std; 4 const int maxn = 3e4 + 10; 5 int s[maxn]; 6 int height[maxn]; 7 8 void init_set() 9 { 10 for (int i = 0; i < maxn; i++) 11 { 12 s[i] = i; 13 height[i] = 0; 14 } 15 } 16 17 18 int find_set(int x) 19 { 20 if (x != s[x]) s[x] = find_set(s[x]); 21 return s[x]; 22 } 23 24 void union_set(int x, int y) 25 { 26 x = find_set(x); 27 y = find_set(y); 28 if (height[x] == height[y]) 29 { 30 height[x]++; 31 s[y] = x; 32 } 33 else 34 { 35 if(height[x] < height[y]) 36 { 37 s[x] = y; 38 } 39 else 40 { 41 s[y] = x; 42 } 43 } 44 } 45 46 int main() 47 { 48 int m, n, x, y; 49 while (~scanf ("%d%d", &n, &m)) 50 { 51 if(n==0&&m==0) 52 return 0; 53 init_set(); 54 for (int i = 1; i <= m; i++) 55 { 56 int tmp; 57 scanf ("%d", &x); //输入人员数 58 scanf ("%d", &tmp);//输入第一个人 59 for (int j = 1; j < x; j++) 60 { 61 scanf ("%d", &y);//后序的和第一个放在同一个集合中 62 union_set(tmp, y); 63 } 64 } 65 int ans = 0; 66 for (int i = 0; i < n; i++) 67 { 68 s[i] = find_set(i); 69 if (s[i] == s[0])//最初学生 0 在所有情况下都被识别为嫌疑人,所以说查找集合和0号是不是同一根 70 { 71 ans++; 72 } 73 } 74 printf ("%d\n", ans); 75 } 76 return 0; 77 }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16285620.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)