C語言并查集的非遞歸實現(xiàn)詳解
【算法分析】
經(jīng)典的遞歸實現(xiàn)的并查集,在數(shù)據(jù)規(guī)模過大時,可能會爆棧,因此有了并查集的非遞歸實現(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); }
【算法代碼】
對問題 http://acm.hdu.edu.cn/showproblem.php?pid=1213 利用非遞歸實現(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
*/
并查集壓縮路徑非遞歸寫法
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é)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
關(guān)于python調(diào)用c++動態(tài)庫dll時的參數(shù)傳遞問題
這篇文章主要介紹了python調(diào)用c++動態(tài)庫dll時的參數(shù)傳遞,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04C語言數(shù)據(jù)結(jié)構(gòu)樹的雙親表示法實例詳解
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)樹的雙親表示法實例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++算法之海量數(shù)據(jù)處理方法的總結(jié)分析
本篇文章是對海量數(shù)據(jù)處理方法進行了詳細的總結(jié)與分析,需要的朋友參考下2013-05-05解決gcc編譯報錯unknown type name ‘bool‘問題
這篇文章主要介紹了解決gcc編譯報錯unknown type name ‘bool‘問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07C++ OpenCV實戰(zhàn)之手寫數(shù)字識別
這篇文章主要為大家詳細介紹了如何使用machine learning機器學(xué)習(xí)模塊進行手寫數(shù)字識別功能,文中的示例代碼講解詳細,感興趣的可以了解一下2022-08-08C++中POCO庫的安裝與基礎(chǔ)知識介紹(Windwos和Linux)
這篇文章主要為大家介紹了C++ POCO庫的簡單介紹、下載以及安裝方式、簡單代碼示例,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-05-05