C語(yǔ)言并查集的非遞歸實(shí)現(xiàn)詳解
【算法分析】
經(jīng)典的遞歸實(shí)現(xiàn)的并查集,在數(shù)據(jù)規(guī)模過(guò)大時(shí),可能會(huì)爆棧,因此有了并查集的非遞歸實(shí)現(xiàn)。核心代碼如下:
int find(int x) {
int t=x;
while(t!=pre[t]) t=pre[t];
while(x!=pre[x]) {
x=pre[x];
pre[x]=t;
}
return t;
}
void merge(int x,int y) {
if(find(x)!=find(y)) pre[find(x)]=find(y);
}
【算法代碼】
對(duì)問(wèn)題 http://acm.hdu.edu.cn/showproblem.php?pid=1213 利用非遞歸實(shí)現(xiàn)的并查集的代碼如下:
#include <iostream>
using namespace std;
const int maxn=1005;
int pre[maxn];
//int find(int x) {
// if(x!=pre[x]) pre[x]=find(pre[x]);
// return pre[x];
//}
int find(int x) {
int t=x;
while(t!=pre[t]) t=pre[t];
while(x!=pre[x]) {
x=pre[x];
pre[x]=t;
}
return t;
}
void merge(int x,int y) {
if(find(x)!=find(y)) pre[find(x)]=find(y);
}
int main() {
int T,N,M;
int p,q;
scanf("%d",&T);
while(T--) {
int ans=0;
scanf("%d%d",&N,&M);
for(int i=1; i<=N; i++) pre[i]=i;
for(int i=1; i<=M; i++) {
scanf("%d%d",&p,&q);
merge(p,q);
}
for(int i=1; i<=N; i++) {
if(find(i)==i) ans++;
}
printf("%d\n",ans);
}
return 0;
}
/*
in:
2
5 3
1 2
2 3
4 5
5 1
2 5
out:
2
4
*/
并查集壓縮路徑非遞歸寫(xiě)法
int find(int x){
int temp=x;
while(temp!=d[temp])
temp=d[temp];
while(x!=d[x]){
x=d[x];
d[x]=temp;
}
return temp;
}
參考文章
//www.dbjr.com.cn/article/222108.htm
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
關(guān)于python調(diào)用c++動(dòng)態(tài)庫(kù)dll時(shí)的參數(shù)傳遞問(wèn)題
這篇文章主要介紹了python調(diào)用c++動(dòng)態(tài)庫(kù)dll時(shí)的參數(shù)傳遞,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)樹(shù)的雙親表示法實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)樹(shù)的雙親表示法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
C++算法之海量數(shù)據(jù)處理方法的總結(jié)分析
本篇文章是對(duì)海量數(shù)據(jù)處理方法進(jìn)行了詳細(xì)的總結(jié)與分析,需要的朋友參考下2013-05-05
解決gcc編譯報(bào)錯(cuò)unknown type name ‘bool‘問(wèn)題
這篇文章主要介紹了解決gcc編譯報(bào)錯(cuò)unknown type name ‘bool‘問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
C++ OpenCV實(shí)戰(zhàn)之手寫(xiě)數(shù)字識(shí)別
這篇文章主要為大家詳細(xì)介紹了如何使用machine learning機(jī)器學(xué)習(xí)模塊進(jìn)行手寫(xiě)數(shù)字識(shí)別功能,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-08-08
C++中POCO庫(kù)的安裝與基礎(chǔ)知識(shí)介紹(Windwos和Linux)
這篇文章主要為大家介紹了C++ POCO庫(kù)的簡(jiǎn)單介紹、下載以及安裝方式、簡(jiǎn)單代碼示例,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-05-05
C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C語(yǔ)言實(shí)現(xiàn)成績(jī)統(tǒng)計(jì)示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)成績(jī)統(tǒng)計(jì)示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

