第10章 並查集

2021-10-17 11:53:48 字數 3447 閱讀 9975

#include

using

namespace std;

/*2≤n≤1000, n表示節點個數

1≤m≤n(n−1)2, m表示最大邊數,每個點除自身外,可以和剩下的n-1個點,相連,所以是n*n(n-1) 注意這樣所有的邊倍計算了兩次,所以最後是n*(n-1)/2

*/const

int maxn=

500010

;int n,m,k;

struct node //邊的 結構,一條邊上的 兩個 點

node[maxn]

;int p[maxn]

;int

find

(int x)

//背過

intmain()

while

(k--)}

} cout << cnt-

1<< endl;

//最後的 cnt表示 連通塊數,需要求得邊 就是 連通塊數-1

}return0;

}

#include

#include

#include

using

namespace std;

const

int maxn=

500010

;struct node

e[maxn]

;int hc[maxn]

,ha[maxn]

;//hc表示id對應的房子個數,ha表示id對應的房子面積

int p[maxn]

,c[maxn]

;bool st[maxn]=;

intfind

(int x)

struct family

;bool

cmp(family a,family b)

return a.id}int

main()

;if(mother!=-1

) e[m++]=

;for

(int j=

0; j} cin >> hc[id]

>> ha[id]

;//注意 輸入

}for

(int i=

0; i)for

(int i =

0; i < m; i ++)}

for(

int i=

0; i;}

} cout << node.

size()

<< endl;

sort

(node.

begin()

,node.

end(

),cmp)

;for

(int i=

0; isize()

; i++

)}

#include

using

namespace std;

const

int maxn=

10010

;struct node

node[maxn]

;bool st[maxn]

;int n;

int p[maxn]

;int

find

(int x)

intmain()

if(i==0)

daibiao=temp2;

if(i!=0)

node[m++]=

;}}for

(int i=

1; i<=maxn; i++

) p[i]

=i;int cnt=niaoshu;

for(

int i=

0; icout << cnt <<

" "<< niaoshu << endl;

int kk;

cin >> kk;

int wsf,xx;

while

(kk--

)return0;

}

/*

題意:每個人給出他的興趣,然後在根據共有的興趣,統計出來人數

1.用vector陣列,下標表示興趣愛好,下面的值是人的編號

2.由於興趣愛好的編號是從1---1000,所以需要全部遍歷,然後以該下面值的第乙個作為根節點,然後進行合併

3.由於上面的合併 是 以人的 節點 作為 下標,所以 通過遍歷 每個 人的 編號,去找到每個人的 編號的 根節點,並統計個數,所以先統計出塊數,然後排序,然後輸出興趣下的人數

*/#include

#include

#include

using

namespace std;

const

int maxn=

1010

;vector<

int> xx[maxn]

;int p[maxn]

;int n;

intfind

(int x)

bool

cmp(

int a,

int b)

intmain()

}for

(int i=

1; i<=n

; i++

) p[i]

=i;for

(int i=

1; i<=

1000

; i++

)//興趣 最大值 就是 1000

}int renshu[maxn]=;

for(

int i=

1; i<=n; i++

)int ans=0;

for(

int i=

1; i<=n; i++

) cout << ans << endl;

sort

(renshu+

1,renshu+n+

1,cmp)

;for

(int i=

1; i<=ans; i++

)}

#include

#include

using

namespace std;

//再輸入的 過程 中每次 更新 滿足條件的 最小值,

intmain()

}else

hash1.

insert

(x);}if

(v1==

1e9)

cout <<

"no solution"

;else

cout << v1 <<

" "<< v2;

return0;

}

並查集 並查集

本文參考了 挑戰程式設計競賽 和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 ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...