良い友達
タイトル説明
「デジタルワールド」と呼ばれる奇妙な空間があり、そこには多くのデジモンがデジタルの世界に住んでいます。彼らの中には仲良しの人もいるかもしれません。デジモンワールドには2つの不文律があります。
まず、デジモンAとデジモンBはデジモンBと同等の仲良しで、デジモンAは仲良しです
第二に、デジモンAとデジモンCが仲良しで、デジモンBとデジモンCも仲良しなら、AとBも仲良し
ここで、これらのデジモンのすべての親友の情報を提供します。質問:各グループの任意の2つのデジモンが親友であり、任意の2つのグループ間のデジモンが親友ではないことを確認して、これらのデジモンをいくつのグループに分割できますか。
入力フォーマット
入力の最初の行には、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;
}