並查集:
\(kruscal\),\(tarjan\)求\(lca\)
分類並查集:食物鏈,團夥(敵人的敵人是我的朋友)
帶權並查集:\(sdoi2016\)齒輪(可用
int father(int x)
建邊:任意相鄰兩格仔之間建邊,權值為海拔差
將邊排序,從小往大乙個乙個往裡加,當乙個並查集內部有起點,並且大小(點數)>=t,這裡面所有的起點的d=最後加入的邊
#includeusing namespace std;
inline int read()
int m,n,t,ecnt;
int a[520][521],siz[500100],fa[500100];
long long lsy[500100];
struct node e[500100];
int ykyk(int x,int y)
void insert(int x,int y,int dis)
bool cmp(node a,node b) 同類\ \ \ \color捕食\):
如果\(a\)和\(b\)是同類,則a的三個節點\((a,a+n,a+2n)\)分別指向\(b\)的對應的三個節點\((b,b+n,b+2n)\)
如果\(a\)吃\(b\),則\(a\)的三個節點分別指向對應\(b\)的三個節點的下乙個節點
#includeusing namespace std;
inline int read()const int mxn=50010;
int n,k;
int cnt,ans;
int fa[mxn*3];
int find(int x)
int main()
if(op==2&&x==y)
if(op==1)
int xx=find(x),yy=find(y);
fa[xx]=yy;
int _x=find(x+n),_y=find(y+n);
fa[_x]=_y;
int x_=find(x+2*n),y_=find(y+2*n);
fa[x_]=y_;
} if(op==2)
int xx=find(x),yy=find(y);
int _x=find(x+n),_y=find(y+n);
int x_=find(x+2*n),y_=find(y+2*n);
fa[yy]=_x;
fa[xx]=y_;
fa[x_]=_y;
} } printf("%d",ans);
return 0;
}
\(bzoj\)
\(2303\)
\([apio2011]\) 方格染色
\(bzoj\)
\(1854\)
\([scoi2010]\) 遊戲
帶權並查集:
\(hdu\)
\(3038\)
\(how\)
\(many\)
\(answers\)
\(are\)
\(wrong\)
\(hihocoder\)
\(1515\) 分數調查
寒假訓練報告1 26(並查集)
今天聽隊友講課講了並查集,好像比去年聽的時候更明白了一些。同時,知道了除了普通並查集,還有種類並查集和帶權並查集等。對於種類並查集的建模能力還有待提高,帶權並查集可能又得下乙個階段才能學習了。三個重要函式 void init int n int find int x void union int x...
2020 寒假私訓 並查集
並查集的原理很簡單 在下標對應的陣列中寫入當前下標的父節點,說明當前節點和父節點有羈絆,無數個子節點連線著乙個父節點,如果要想判斷兩個節點之間是否有羈絆,只需對一對他們的父輩 根節點 就行了。並查集一般用於查詢圖中節點之間的關係。並查集演算法一般包括3大部分 find 函式用來確定某節點x1的父親節...
並查集 並查集
本文參考了 挑戰程式設計競賽 和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 ...