zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

Ubiquitous Religions

2023-02-18 16:34:30 时间

Ubiquitous Religions

描述

当今世界上有太多不同的宗教,很难一一掌握。您有兴趣找出您大学中有多少不同宗教信仰的学生。
您知道您的大学中有n个学生(0 <n <= 50000)。向每个学生询问他们的宗教信仰是不可行的。此外,许多学生不愿意表达自己的信念。避免这些问题的一种方法是,问m(0 <= m <= n(n-1)/ 2)对学生,并询问他们是否信仰同一宗教(例如,他们可能知道他们是否都参加同一宗教)教会)。从这些数据中,您可能不知道每个人的信仰,但是您可以对校园中可以代表多少种不同宗教的上限有所了解。您可以假设每个学生最多订阅一种宗教。

输入项

输入包含多种情况。每种情况都以指定整数n和m的行开头。接下来的m行分别由两个整数i和j组成,指定学生i和j信仰相同的宗教。学生从1到n编号。输入的结尾由其中n = m = 0的行指定。

输出量

对于每个测试用例,请在一行上打印例号(以1开头),然后打印大学学生所信奉的不同宗教的最大数量。

样本输入

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

样本输出

情况1:1
Case 2: 7

题意:学校有n个同学,每个同学有且只有一个信仰,给出m对有同一信仰的同学,问存在多少种不同的信仰?
输入0 0时结束程序。

代码

#include<iostream>
using namespace std;
const int max_size=100;
int pre[max_size],height[max_size];
void init_set(int count){
    for (int i = 1; i <= count; i++)
    {
        pre[i]=i;
        height[i]=0;
    }
}
int find_set(int x){
    if (x!=pre[x])
    {
        pre[x]=find_set(pre[x]);
    }
    return pre[x];
}


void union_set(int x,int y){
    x=find_set(x);
    y=find_set(y);
    if (height[x]==height[y])
    {
        height[x]=height[x]+1;
        pre[y]=x;
    }else
    {
        if (height[x]<height[y])
            pre[x]=y;
        else
            pre[y]=x;
    }
}


int main(){
    int n,m,x,y;
    while((cin>>n)&&n){
        cin>>m;
        init_set(n);
        for (int i = 1; i <= m; i++)
        {
            cin>>x>>y;
            union_set(x,y);
        }
        int ans=0;
        for (int i = 1; i <= n; i++)
        {
            if (pre[i]==i)
            {
                ans++;
            }
        }
        cout<<ans<<endl;
    }
}