题目
并查集
思路
并查集模板题,不过这道题的并查集使用到的不是抽象的数组,而是字符串,如果要以字符串为键的话,则需要用到哈希映射。
代码
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
class UnionFind {
unordered_map<string, string> fa;
public:
UnionFind(const vector<string>& names) {
for (auto&& name : names) {
fa[name] = name;
}
}
~UnionFind() {}
string find(string x) {
string r = x;
while (r != fa[r]) {
r = fa[r];
}
string i = x, j;
while (i != r) {
j = fa[i];
fa[i] = r;
i = j;
}
return r;
}
void uni(string x, string y) {
x = find(x);
y = find(y);
if (x != y) {
fa[x] = y;
}
}
};
int main(void) {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n = 0, m = 0, i = 0, a = 0;
cin >> n >> m;
vector<string> names(n);
for (i = 0; i < n; i++) {
cin >> names[i];
}
UnionFind u(names);
string name, na;
while (m--) {
cin >> a >> name >> na;
if (a == 1) {
// 并
u.uni(name, na);
} else if (a == 2) {
// 查
name = u.find(name);
na = u.find(na);
cout << (name == na) << endl;
}
}
return 0;
}