問題:一對整數p,q可以理解為「p與q是相連的」。問給出一組整數對p,q,判斷p,q是否相連,如果相連,則忽略,不想連則新增連線。
如: a->b->c->d 則此時認為abcd互相連線。如果新增另一組整數對a,c;則新增不成功,因為此時a,c已經連通;若新增另一組整數對a,f。則新增成功,此時a,b,c,d,f互相連通。
為了方便,我們將物件稱為觸點,將整數對稱為連線, 將有多少個連通稱為連通分量簡稱分量
給出演算法的api:
public class uf
uf(int n) 以整數標識(0->n-1)初始化n個觸點
int union(int p,int q) 在p,q之間新增一條連線
int find(int p) p所在分量的識別符號
boolean connected(int p,int q) 如果p與q存在於同乙個分量中則返回true
int count() 連通分量的數量
具體實現**:
package test;
public class uf
}public int find(int p)
public boolean connected(int p,int q)
public int count()
public void union(int p,int q)}}
count--;}}
動態連通性問題
首先定義演算法的api 方法作用 uf int n 初始化觸點及其他資料 int find int p 返回p所在連通分量的識別符號 int union int p,int q 在p和q之間新增一條線 int count 返回連通分量的數量 boolean connected int p,int q...
動態連通性 union find演算法
等價關係 定義 p,q 表示p與q相連,是一種等價關係,具有自反性,對稱性以及傳遞性。等價關係定義了等價類,給定多個整數對,判斷其是否屬於同一類,即是否具有動態連通性。從集合的角度在處理 p,q 時,判斷其是否屬於不同的集合,如果屬於不同的集合則將p以及p所屬的集合進行合併。給定多個整數對,可以確定...
並查集,動態連通性
n,m n個點,m條邊 隨之而來m條邊 q 代表q個操作 q行,每行乙個序號,代表將第m個輸入的邊刪除,問刪除後有多少個連通塊。思路 我們將m條邊,和q詢問記錄下來,並將要刪除的邊標記。然後對那些不用的邊使用並查集,並算出有多少個連通塊。然後從最後乙個詢問開始,依次將那些邊加入並查集,如果加入時,兩...