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 }
复制代码

 

posted @   江上舟摇  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示