假如已知有 n 个人和 m 对好友关系 (存于数字 r) 。 如果两个人是直接或间接的好友 (好友的好友的好友…) , 则认为他们属于同一个朋友圈,请写程序求出这 n 个人里一共有多少个朋友圈,或者判断两个人是否属于同一个朋友圈。 假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有 5 个人,1 和 2 是好友,2 和 3 是好友,4 和 5 是好友,则 1、2、3 属于一个朋友圈,4、5 属于另一个朋友圈,结果为 2 个朋友圈。
直接来真题吧
990. 等式方程的可满足性
给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。
只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false
示例 4:
输入:[“a==b”,“b!=c”,“c==a”]
输出:false
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//封装一个类,实现查找,合并功能。把字母用整数代替
class UnionFind {
public:
//用一个向量来记录每个字母的领导者(监护人)
vector<int> parent;
public:
//构造函数,初始化parent,是他们每一个字母的领导都是自己
UnionFind() {
for (int i = 0; i < 26; i++)
parent.push_back(i);
}
//查找该字母的领导者
int find(int index)
{
while (index != parent[index])
index = parent[index];
return index;
}
//想要合并两个朋友圈,就把一个圈的领导换成另一个圈的领导
void Union(int index1, int index2)
{
parent[find(index1)] = find(index2);
}
};
bool equationsPossible(vector<string>& equations) {
UnionFind uf;
for (const string &str : equations)
{
//构造合并朋友圈
if (str[1] == '=')
{
int index1 = str[0] - 'a';
int index2 = str[3] - 'a';
uf.Union(index1, index2);
}
}
for (const string &str : equations)
{
//判断是否属于同一朋友圈
if (str[1] == '!')
{
int index1 = str[0] - 'a';
int index2 = str[3] - 'a';
if (uf.find(index1) == uf.find(index2)) return false;
}
}
return true;
}
int main()
{
vector<string> v;
string s;
while (cin>>s)
v.push_back(s);
cout << equationsPossible(v) << endl;
system("pause");
return 0;
}