数据结构实验 6.宗教信仰

题目

【问题描述】

世界上有许多宗教,你感兴趣的是你学校里的同学信仰多少种宗教。

你的学校有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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值