c++之并查集

假如已知有 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;

	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值