并查集

[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;
}
posted @ 2025-01-06 09:33  yaoguyuan  阅读(8)  评论(0)    收藏  举报