547. Number of Provinces
Union Find
/*
* @lc app=leetcode id=547 lang=cpp
*
* [547] Number of Provinces
*
* https://leetcode.com/problems/number-of-provinces/description/
*
* algorithms
* Medium (67.05%)
* Likes: 9841
* Dislikes: 367
* Total Accepted: 981.9K
* Total Submissions: 1.5M
* Testcase Example: '[[1,1,0],[1,1,0],[0,0,1]]'
*
* There are n cities. Some of them are connected, while some are not. If city
* a is connected directly with city b, and city b is connected directly with
* city c, then city a is connected indirectly with city c.
*
* A province is a group of directly or indirectly connected cities and no
* other cities outside of the group.
*
* You are given an n x n matrix isConnected where isConnected[i][j] = 1 if the
* i^th city and the j^th city are directly connected, and isConnected[i][j] =
* 0 otherwise.
*
* Return the total number of provinces.
*
*
* Example 1:
*
*
* Input: isConnected = [[1,1,0],[1,1,0],[0,0,1]]
* Output: 2
*
*
* Example 2:
*
*
* Input: isConnected = [[1,0,0],[0,1,0],[0,0,1]]
* Output: 3
*
*
*
* Constraints:
*
*
* 1 <= n <= 200
* n == isConnected.length
* n == isConnected[i].length
* isConnected[i][j] is 1 or 0.
* isConnected[i][i] == 1
* isConnected[i][j] == isConnected[j][i]
*
*
*/
// @lc code=start
class UnionFind {
private:
vector<int> parent;
vector<int> rank;
public:
UnionFind(int n)
{
parent.resize(n);
rank.resize(n, 1);
for (int i = 0; i < n; i++)
{
parent[i] = i;
}
}
int find(int x)
{
if (x != parent[x])
{
parent[x] = find(parent[x]);
}
return parent[x];
}
void unionNodes(int n1, int n2)
{
int p1 = find(n1);
int p2 = find(n2);
if (p1 == p2) return;
if (rank[p1] > rank[p2])
{
parent[p2] = p1;
rank[p1] += rank[p2];
}
else
{
parent[p1] = p2;
rank[p2] += rank[p1];
}
}
};
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected)
{
int n = isConnected.size();
UnionFind uf(n);
int cnt = n;
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (isConnected[i][j] && uf.find(i) != uf.find(j))
{
cnt--;
uf.unionNodes(i, j);
}
}
}
return cnt;
}
};
// @lc code=end
- T:
- S: