網路中節點間的鏈結狀態
網路是個抽象的概念:使用者之間形成的網路比路徑問題要回答的問題少
和堆作比較
編號分為0和1,只要編號相同就是,同種
/*** 初始化
* @param size
*/public unionfind1(int size)
//檢視元素p和元素q是否所屬乙個集合
@override
public boolean isconnected(int p,int q)
//合併元素p和元素q所屬的集合
@override
public void unionelements(int p,int q)
//檢視元素p和元素q是否所屬乙個集合
@override
public boolean isconnected(int p,int q)
//合併元素p和元素q所屬的集合
@override
public void unionelements(int p,int q)
//查詢元素p和元素q是否所屬乙個集合
@override
public boolean isconnected(int p,int q)
/*** 合併元素p和元素q所屬的集合
* o(h)複雜度,h為樹的高度
*/@override
public void unionelements(int p,int q)
}
package com.binglian.unionfind;
/** * 第三個版本 quick union 基於的size優化
* @author binglian
* */
public class unionfind3 implements uf
return p; }
//查詢元素p和元素q是否所屬乙個集合
@override
public boolean isconnected(int p,int q)
/*** 合併元素p和元素q所屬的集合
* o(h)複雜度,h為樹的高度
*/@override
public void unionelements(int p,int q)else}}
第四版本
package com.binglian.unionfind;
/** * 第四個版本 quick union 基於的size優化
* rank[i]表示根節點為i的樹的高度
* @author binglian
* */
public class unionfind4 implements uf
//查詢元素p和元素q是否所屬乙個集合
@override
public boolean isconnected(int p,int q)
/*** 合併元素p和元素q所屬的集合
* o(h)複雜度,h為樹的高度
*/@override
public void unionelements(int p,int q)
}}
// 我們的第五版union-find
public class unionfind5 implements uf
}@override
public int getsize()
// 查詢過程, 查詢元素p所對應的集合編號
// o(h)複雜度, h為樹的高度
private int find(int p)
return p;
}// 檢視元素p和元素q是否所屬乙個集合
// o(h)複雜度, h為樹的高度
@override
public boolean isconnected( int p , int q )
// 合併元素p和元素q所屬的集合
// o(h)複雜度, h為樹的高度
@override
public void unionelements(int p, int q)}}
並查集的一些理解
從最基本的並查集之後引申到帶權並查集 抽象出種類並查集 實際上都是維護乙個又乙個集合之間的關係 並查集主要寫兩個函式find和merge find函式可以寫成路徑壓縮 或者 按秩合併 或者兩個同時寫 但一般單獨的路徑壓縮就可以了 find函式需要注意的是在find函式內維護陣列 需要等回溯時再維護 ...
種類並查集的一些理解
之前暑假集訓的時候學了一下並查集,但是那個時候完全搞不懂種類並查集 帶權並查集 的路徑壓縮以及兩個節點關係的合併。現在有重新學習了一下,算是對種類並查集有了一些粗淺的理解了吧。關於路徑壓縮 int find int x 其實之前我就不是很懂,為什麼要設乙個temp儲存father x 的值,不應該像...
C primerplus書摘1 第一到第四章
1.getline get 下列程式輸入輸出為 cin不會丟棄換行符,會把換行符留在輸入佇列中,所以getline遇到換行符會把換行符替換成 0 所以s是空串。1 include2 include3 include4 include5 using namespace std 6int main 7 ...