功能:在近乎o(1)的時間複雜度內完成:
將兩個集合合併;
詢問兩個元素是否在乙個集合中。
基本原理:
每乙個集合用樹(不一定是二叉樹)表示。
根節點編號為集合編號。
每個結點x儲存父結點p[x]。
基本操作:
if (p[x] == x)//判斷樹根
while (p[x] != x) x=p[x];//求x的集合編號
p[x]=y//合併兩個集合
(p[x] - 集合x編號,p[y] - 集合y編號)
優化:搜過後直接把路徑上所有結點直接指向根節點。
核心:
int
find
(int x)
特點:
實現刪除修改任意元素(stl無法直接實現)
用於dijkstra演算法
操作:插入乙個數
求集合中最小值
刪除最小值
刪除任意元素
修改任意元素
基本結構:
完全二叉樹
儲存:一維陣列
建堆:for (int i = n/2 ;i ;i --) down(i);
時間複雜度:o(n)
功能:快速高效儲存和查詢字串集合。
構造:字串中從前向後查詢每一位是否是樹的結點,不是則建立。
每個串結尾打標記。
特點:題目中一定限制了字母種類,最多52+10數字;
種類特別多(例如漢字)時,用二進位制位存。
1.7小結
POJ 2513 Trie樹 尤拉迴路 並查集
1.把木棒的端點考慮為頂點,木棒考慮為邊,建立起乙個無向圖。2.問題轉化為在無向圖上判斷是否有尤拉迴路或者尤拉道路。3.在無向圖上判斷是否有尤拉迴路或者尤拉道路 尤拉定理 並查集 判斷連通性 4.考慮如何統計每個頂點的度,開始用的是暴力解法,直接用陣列記錄頂點,並且通過順序查詢獲得頂點編號,tle,...
POJ 2513 TRIE樹 並查集 尤拉路
題意 給定許多根木棒,兩邊分別塗有不同顏色,問能否將他們連成一條直線。規定只能將相同顏色的兩端相連。思路 用trie樹儲存單詞,trie樹最後乙個字母的節點編號就是這個單詞的編號 可以和模擬 並查集檢查是否連通 有尤拉路的前提是圖連通 最後加上無向圖尤拉路的判定就好了 奇數度的節點只能有0或2個 v...
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...