示例题目1,一维
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a087291aa7aafb063a3a5d270d8368f9.png)
class Solution {
private:
vector<int> parent;
vector<int> nums;
unordered_map<string, int> name2id;
vector<string> name;
void merge(int f, int s) {
int rootf = find(f);
int roots = find(s);
if (rootf == roots) return;
if(name[rootf] < name[roots]) {
parent[roots] = rootf;
nums[rootf] += nums[roots];
} else {
parent[rootf] = roots;
nums[roots] += nums[rootf];
}
}
int find(int x) {
while(x!=parent[x]) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
public:
vector<string> trulyMostPopular(vector<string>& names, vector<string>& synonyms) {
int n = names.size(), m = synonyms.size();
if (n < 2 || m == 0) return names;
for (int i = 0; i < n; ++i) {
parent.push_back(i);
string tmp = getname(names[i]);
name.push_back(tmp);
nums.push_back(getnum(names.at(i)));
name2id[tmp] = i;
}
for (int i = 0; i < m; ++i) {
std::pair<string, string> namepair = get_names(synonyms.at(i));
merge(name2id[namepair.first], name2id[namepair.second]);
}
set<string> st;
for (int i = 0; i < n; ++i) {
int t = find(i);
st.insert(joint(name[t], nums.at(t)));
}
vector<string> ans(st.begin(), st.end());
return ans;
}
int getnum(string &name) {
string::size_type p1 = name.find_first_of('(');
string::size_type p2 = name.find_first_of(')');
string ans = name.substr(p1+1, p2-p1-1);
return atoi(ans.c_str());
}
string getname(string &name) {
string::size_type p = name.find_first_of('(');
string ans=name.substr(0, p);
return ans;
}
std::pair<string, string> get_names(string namepair) {
string::size_type p = namepair.find_first_of(',');
string s1 = namepair.substr(1, p-1), s2 = namepair.substr(p+1, namepair.size()-p-2);
return std::make_pair(s1, s2);
}
string joint(string s, int n) {
string ans(s);
ans += "(";
ans += to_string(n);
ans += ")";
return ans;
}
};
示例题目2,二维
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7f825074e28f50d2bd1bb40e93991314.png)
class Solution {
private:
int parent[20000];
int size[20000];
void merge(int a, int b) {
int ra = find(a);
int rb = find(b);
if (ra==rb) return;
if (size[ra] < size[rb]) {
parent[ra] = rb;
size[rb] += size[ra];
} else {
parent[rb] = ra;
size[ra] += size[rb];
}
}
int find(int x) {
while (x != parent[x]) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
public:
int removeStones(vector<vector<int>>& stones) {
int N = stones.size();
for (int i = 0; i <20000; ++i) {
parent[i] = i;
size[i] = 1;
}
for (auto &s : stones) {
merge(s[0], s[1] + 10000);
}
unordered_set<int> ust;
for (auto &s : stones) {
int r = find(s[0]);
ust.insert(r);
}
return N - ust.size();
}
};
并查集核心代码
class UnionFind {
private:
int count;
vector<int> parent;
vector<int> size;
public:
UnionFind(int n) : count(n) {
for (int i = 0; i < n; ++i) {
parent.push_back(i);
size.push_back(1);
}
}
void merge(int a, int b) {
int ra = find(a);
int rb = find(b);
if (ra==rb) return;
if (size[ra] < size[rb]) {
parent[ra] = rb;
size[rb] += size[ra];
} else {
parent[rb] = ra;
size[ra] += size[rb];
}
count--;
}
int find(int x) {
while (x != parent[x]) {
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
bool connected(int p, int q) {
return find(p) == find(q);
}
};