第三部分 數據結構 -- 第二章 隊列-1362:家庭問題(family)

1362:家庭問題(family)

時間限制: 1000 ms 內存限制: 65536 KB
提交數: 2937 通過數: 1507
【題目描述】
有n個人,編號爲1,2,……n,另外還知道存在K個關係。一個關係的表達爲二元組(α,β)形式,表示α,β爲同一家庭的成員。

當n,k和k個關係給出之後,求出其中共有多少個家庭、最大的家庭中有多少人?

例如:n=6,k=3,三個關係爲(1,2),(1,3),(4,5)

此時,6個人組成三個家庭,即:{1,2,3}爲一個家庭,{4,5}爲一個家庭,{6}單獨爲一個家庭,第一個家庭的人數爲最多。

【輸入】
第一行爲n,k二個整數(1≤n≤100)(用空格分隔);

接下來的k行,每行二個整數(用空格分隔)表示關係。

【輸出】
二個整數(分別表示家庭個數和最大家庭人數)。

【輸入樣例】
6 3
1 2
1 3
4 5
【輸出樣例】
3 3


思路:並查集去做

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#define N 301
using namespace std;
int father[N];
int a[N];
int find(int x){//查找
	if(father[x] == x)
	 return x;
	 return father[x] = find(father[x]);
} 

void un(int x, int y){//歸併
	int f1 = find(x);
	int f2 = find(y);
	if(f1 != f2)
	father[f2] = f1;
}
int main(){
	int n,k;
	cin >> n >> k;
	for(int i = 1; i <= n; i++)
	father[i] = i;
	for(int i = 1; i <= k; i++)
	{
		int x,y;
		cin >> x >> y;
		un(x,y); 
	}
	for(int i = 1; i <= n; i++)
	a[find(i)]++;
	int ans = 0, maxn = 0;
	for(int i = 1; i <=n; i++){
		if(a[i] > 0)
		ans++;
		maxn = max(maxn,a[i]);
	}
	cout << ans << " " << maxn <<endl; 
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章