良い友達(そしてコレクションをチェックしてください)

良い友達

タイトル説明

「デジタルワールド」と呼ばれる奇妙な空間があり、そこには多くのデジモンがデジタルの世界に住んでいます。彼らの中には仲良しの人もいるかもしれません。デジモンワールドには2つの不文律があります。

まず、デジモンAとデジモンBはデジモンBと同等の仲良しで、デジモンAは仲良しです

第二に、デジモンAとデジモンCが仲良しで、デジモンBとデジモンCも仲良しなら、AとBも仲良し

ここで、これらのデジモンのすべての親友の情報を提供します。質問:各グループの任意の2つのデジモンが親友であり、任意の2つのグループ間のデジモンが親友ではないことを確認して、これらのデジモンをいくつのグループに分割できますか。

yangli.png

入力フォーマット

入力の最初の行には、2つの正の整数n(n <= 100)とm(m <= 100)があり、それぞれデジモンの数と仲良しのグループの数を表します。デジモンの数は1〜nです。

出力フォーマット

これらのデジモンを分割できるグループの数を示す整数を出力します

サンプル入力1

4 2

1 4

2 3

サンプル出力1

2

サンプル入力2

7 5
1 2
2 3
3 1
1 4
5 6

サンプル出力

3

/*
 *@Author LeeG
 *@Date	2020-10-15 15:40
 *@Content 好朋友(并查集) 
*/
#include <bits/stdc++.h>
using namespace std;
int n, m;
int father[100];

int findFather(int x){		 
	int a = x;
	while(x != father[x]){
		x = father[x];		//先找到根结点 
	}
	//把路径上所有的结点的根结点都改成x
	while(a != father[a]){	//路径压缩,优化查找性能
		int z = a;
		a = father[a];
		father[z] = x;
	} 
	return x;
} 

void Union(int a, int b){
	int fa = findFather(a);
	int fb = findFather(b);
	if(fa != fb){			//判断是否在同一个集合中 
		father[fb] = fa;
	}
}

/*
测试数据:
7 5
1 2
2 3
3 1
1 4
5 6 
*/
int main(){
	cin>>n>>m;
	//1. 初始化father数组,所有结点初始化根结点为本身自己 
	for(int i = 1; i <= n; i++){
		father[i] = i;
	} 
	for(int i = 0; i < m; i++){
		int a, b;
		cin>>a>>b;
		Union(a, b);			//合并a和b所在的集合 
	}
	int ans = 0;
	int s[10001];
	memset(s, 0, sizeof(s));
	for(int i = 1; i <= n; i++){
		int temp = findFather(i);
		if(s[temp] == 0){
			ans++;
			s[temp] = 1;
		}
	}
	cout<<ans;
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44723496/article/details/109100594