题目链接洛谷P1892
纪念第一道自主完成的绿题。本题我的方法相对简单,易懂,比较友好。
#include <bits/stdc++.h> //本题的题意描述的不太清楚,也可能是我的理解出了问题
using namespace std; // 实际就是想问能分成几组 ,同一个祖宗节点的集合算一组
int f[1010]; //每个节点的祖宗节点
int a[1010][1010]; //a[x][y] =1 代表y是x的敌人 本题数据范围不大,这种做法对新手也是非常易懂;
int find(int x) //并查集路径压缩
{
if (f[x] == x)
return x;
else
return f[x] = find(f[x]); //等于 { f[x]=find(f[x]);
// return f[x];}
}
void hebing(int x, int y) //并查集的合并
{
int f1 = find(x);
int f2 = find(y);
if (f1 != f2)
f[f1] = f2;
}
int main()
{
int n; //输入总人数
cin >> n;
for (int i = 1; i <= n; i++)
f[i] = i;
int t;
cin >> t; //输入总线索数
for (int i = 1; i <= t; i++)
{
char c;
int x, y;
cin >> c >> x >> y; //输入
if (c == 'F')
hebing(x, y); //如果两个人是朋友,直接合并
else
{
//否则的话 将y与x的敌人进行合并。只需合并一次即可,因为直接合并到祖宗节点下面。
for (int j = 1; j <= n; j++)
{
if (a[x][j] == 1)
{
hebing(j, y);
break;
}
}
a[x][y] = 1; //将y加入到x的敌人队列中
//同理 将x与y的敌人进行合并......
for (int j = 1; j <= n; j++)
{
if (a[y][j] == 1)
{
hebing(j, x);
break;
}
}
a[y][x] = 1; //将x加入到y的敌人队列当中
}
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
if (f[i] == i) //数祖宗节点就能表示集合的个数。
ans++;
} //如果对你有帮助可以帮我点个赞,支持一下。
cout << ans << endl;
return 0;
}