首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

UVA 12232 Exclusive-OR:加權並查集處理異或關係

     編輯:C++ 入門

題目核心

維護 n 個變量的異或關係,支持三種操作:賦值、異或等式、查詢異或和。需檢測矛盾並輸出第一條衝突的賦值操作編號;查詢無法確定時輸出 "I don't know."。

加權並查集設計

  • f[x]:父節點
  • d[x]:x 到父節點的異或值
  • 引入虛擬節點 0 代表「已確定值」的集合,其父節點固定為自己

關鍵操作

int getfar(int x) {
    if (x == f[x]) return x;
    int tmp = f[x];
    f[x] = getfar(f[x]);
    d[x] ^= d[tmp];  // 路徑壓縮時更新異或值
    return f[x];
}

// 合併:p, q 為根節點,k 為 u^v 的值
if (p != q) { f[p] = q; d[p] = d[u]^d[v]^k; }
else return (d[u]^d[v]) != k;  // 矛盾檢測

查詢處理

將查詢集合按根節點分組。若某組大小為奇數且根 ≠ 0,則無法確定值;否則異或所有 d[num[i]] 即為答案。

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