☰
547. 省份数量(bfs,并查集union find)
2026/10/1 1:51:14 网站建设 项目流程

链接:547. 省份数量

题解:力扣

class Solution { public: int findCircleNum(vector<vector<int>>& M) { std::unordered_map<int, vector<int>> edges; // 构建邻接矩阵 for(int i = 0; i < M.size(); ++i) { for(int j = 0; j < M[i].size(); ++j) { if(M[i][j] == 1) { edges[i].push_back(j); edges[j].push_back(i); } } } // 标记结点是否访问过 std::unordered_map<int, bool> visited; int cnt = 0; // 以每个城市为顶点 for(int i = 0; i < M.size(); ++i) { if(visited.find(i) == visited.end()) { ++cnt; std::queue<int> que; que.push(i); // 标记访问过的结点 visited[i] = true; while(!que.empty()) { int front = que.front(); que.pop(); for(auto& node : edges[front]) { // 如果这个结点没访问过 if(visited.find(node) == visited.end()) { que.push(node); // 标记访问过的结点 visited[node] = true; } } } } } return cnt; } };
class UnionFind { public: UnionFind():_count(0) { } void add(int p) { _father[p] = p; _size[p] = 1; ++_count; } void merge(int p, int q) { int p_root = find(p); int q_root = find(q); if (p_root != q_root) { _father[p_root] = q_root; _size[q_root] += _size[p_root]; --_count; } } bool is_connected(int p, int q){ return find(p) == find(q); } int get_size(int p) { return _size[find(p)]; } int get_count() { return _count; } private: int find(int p) { while (_father[p] != p) { p = _father[p]; } return p; } private: std::unordered_map<int, int> _father; std::unordered_map<int, int> _size; int _count; }; class Solution { public: int findCircleNum(vector<vector<int>>& isConnected) { if (isConnected.size() <= 0) { return 0; } int n = isConnected[0].size(); UnionFind uf; for (int i = 0; i < n; ++i) { uf.add(i); } for (int i = 0; i < isConnected.size(); ++i) { for (int j = 0; j < isConnected[0].size(); ++j) { if (i == j || isConnected[i][j] == 0) { continue; } if (uf.is_connected(i, j)) { continue; } uf.merge(i, j); } } return uf.get_count(); } };
class Solution { public: int findCircleNum(vector<vector<int>>& isConnected) { int len = isConnected.size(); if (len <= 0) { return 0; } std::unordered_map<int, std::unordered_set<int>> graph; for (int i = 0; i < isConnected.size(); ++i) { for (int j = 0; j < isConnected[i].size(); ++j) { if (!isConnected[i][j]) { continue; } graph[i].insert(j); graph[j].insert(i); } } int result = 0; std::vector<bool> visited(isConnected.size(), false); for (int i = 0; i < isConnected.size(); ++i) { if (visited[i]) { continue; } ++result; bfs(i, graph, visited); } return result; } private: void bfs(int i, std::unordered_map<int, std::unordered_set<int>>& graph, std::vector<bool>& visited) { std::queue<int> que; que.push(i); visited[i] = true; while (!que.empty()) { auto f = que.front(); que.pop(); for (auto neigh : graph[f]) { if (visited[neigh]) { continue; } visited[neigh] = true; que.push(neigh); } } } };

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询