首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 連通分量計數:Union-Find (并查集) 解決格子連通問題

     編輯:程式設計疑難解答

問題背景

二維網格非零值視為細胞,相鄰 (上下左右) 同值歸為一組,求連通分量數。

算法:Union-Find

  1. 將二維坐標 `(r,c)` 映射為一維索引 `id = r * cols + c`。
  2. 初始化 `parent[id] = id`。
  3. 遍歷每個非零格子,向右、向下檢查鄰居,若值相同 `union(id, nid)`。
  4. 統計 `find(i)==i` 的根節點數 (非零格子)。

代碼框架


class UnionFind {
    vector parent, rank;
    UnionFind(int n): parent(n), rank(n,0) { iota(parent.begin(), parent.end(), 0); }
    int find(int x) { return parent[x]==x?x:parent[x]=find(parent[x]); }
    void unite(int x, int y) {
        x=find(x); y=find(y); if(x==y) return;
        if(rank[x]>& grid) {
    int rows=grid.size(), cols=grid[0].size();
    UnionFind uf(rows*cols);
    for(int r=0;r roots;
    for(int r=0;r

參考

Coursera Introduction to Algorithms 第一周 Union-Find 講解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved