qbzt寒假 並查集

2022-02-19 16:22:09 字數 1636 閱讀 8412

並查集:

\(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 ...