题目
【问题描述】
世界上有许多宗教,你感兴趣的是你学校里的同学信仰多少种宗教。
你的学校有n名学生(0 < n <= 50000),你不太可能询问每个人的宗教信仰,因为他们不太愿意透露。但是当你同时找到2名学生,他们却愿意告诉你他们是否信仰同一宗教,你可以通过很多这样的询问估算学校里的宗教数目的上限。你可以认为每名学生只会信仰最多一种宗教。
【输入形式】
输入包括多组数据。
每组数据的第一行包括n和m,0 <= m <= n(n-1)/2,其后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
【样例输出】
Case 1: 1
Case 2: 7
分析
建一个标志数组 f f f, f [ i ] = 0 f[i]=0 f[i]=0代表 i i i同学的宗教未被统计, f [ i ] = 1 f[i]=1 f[i]=1代表 i i i同学的宗教已经被统计
踩坑:所有信息输入结束后,未被统计的同学每个人都代表一种不同的宗教。
如:输入是:
10 1
1 2
0 0
表示有9种宗教。
C++代码
#include<iostream>
#include<string.h>
using namespace std;
int f[1005];
int main(){
int n,m,a,b;
int sum = 0, count=0;
while(true){
cin >> n >>m;
if(n==0 && m==0)
break;
count ++;
sum = 0;
memset(f, 0, sizeof(f)); // 数组归0
while(m--){
cin >> a >> b;
if(f[a]==0 && f[b]==0)
sum++;
f[a]=1,f[b]=1; // 此宗教已经统计
}
for(int i=1; i<=n ;i++) // 未提到的同学是每个人单独信仰一种宗教
if(f[i]==0)
sum++;
cout <<"Case "<< count <<": "<<sum <<endl;
}
}