并查集
[Algo] 并查集
基本模型:
int father[MAXN];
int sets;
void build(int n)
{
for (int i = 0; i < n; i++) father[i] = i;
sets = n;
}
int find(int i)
{
if (father[i] != i) father[i] = find(father[i]);
return father[i];
}
bool isSameSet(int i, int j)
{
return find(i) == find(j);
}
void Union(int i, int j)
{
if (!isSameSet(i, j))
{
father[find(i)] = find(j);
sets--;
}
}
1. 情侣牵手
// 1. 情侣牵手
// https://leetcode.cn/problems/couples-holding-hands/
int minSwapsCouples(vector<int>& row) {
int n = row.size() / 2;
build(n);
for (int i = 0; i < row.size(); i += 2) Union(row[i] / 2, row[i + 1] / 2);
return n - sets;
}
2. 相似字符串组
// 2. 相似字符串组
// https://leetcode.cn/problems/similar-string-groups/
bool similar(vector<string>& strs, int i, int j)
{
string str1 = strs[i], str2 = strs[j];
int diff = 0;
for (int k = 0; k < str1.size(); k++) if (str1[k] != str2[k]) diff++;
return diff == 2 || diff == 0;
}
int numSimilarGroups(vector<string>& strs) {
int n = strs.size();
build(n);
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
{
if (similar(strs, i, j)) Union(i, j);
}
return sets;
}
3. 岛屿数量
// 3. 岛屿数量
// https://leetcode.cn/problems/number-of-islands/
int numIslands(vector<vector<char>>& grid) {
int n = grid.size(), m = grid[0].size(), zeros;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) if (grid[i][j] == '0') zeros++;
build(n * m);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (grid[i][j] == '0') continue;
int index = i * m + j;
if (i > 0 && grid[i - 1][j] == '1') Union(index, index - m);
if (j > 0 && grid[i][j - 1] == '1') Union(index, index - 1);
}
return sets - zeros;
}
浙公网安备 33010602011771号