所謂並查集,就是指查詢無向圖或是有向圖中各個點的聯通與否,其中可以分為兩個部分,乙個是根節點的尋找,乙個是聯通過程。首先在根節點的尋找中使用儲存前驅節點資訊的數pre,
逐層詢問,直到最上的點;如果兩個點的最上的點不同那麼就需要將他們聯通,聯通的方法就是將其中乙個最上點的前驅節點轉為另乙個最上點,這要兩個塊就順利聯通了。
路徑壓縮:把每次找到的前驅節點都指向他們的最上點這樣下次尋找就只用向上查詢一層就可以得到最上點的資訊了。
具體**如下,詳情見注釋:
#include
#include
#include
using
namespace
std;
int pre[1010];
int n,m;
int find_root(int x)
//自帶路徑壓縮的尋找根節點的函式,巧妙地使用了三目運算子
int main()
int rx,ry;
for(int i=0;iint x,y;
scanf("%d%d",&x,&y);
rx=find_root(x);
ry=find_root(y);
if(rx!=ry)//鏈結過程,也可以單獨構建函式;
}int ant=0;
for(int i=1;i<=n;i++)
}printf("%d\n",ant-1);
}return
0;}
僅代表個人觀點,歡飲交流**,勿噴~
HDU 1232 暢通工程(並查集)
題意 有n個城鎮,已經現在已經有m條道路,每條道路連線兩個城鎮 可以重複連線 目標是使任意兩個城鎮間都可以實現交通 不一定有直接的道路相連,只要互相間接通過道路可達即可 求最少還需要建設多少條道路。本題看上去像圖的連通性問題,和圖論有關,但是其實不必用圖論的那些演算法解決。說這話是因為這是並查集配的...
並查集 HDU 1232 暢通工程
problem description 某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省 暢通工程 的目標是使全省任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要互相間接通過道路可達即可 問最少還需要建設多少條道路?input 測試輸入包含若干測試用例。...
hdu1232 暢通工程 並查集入門
推薦乙個有趣的並查集講解文章點這裡 hdu1232 暢通工程 講解都在 中,很好理解 includeusing namespace std int fa 1100 fa陣列記錄每個點的父親 int lcount int find int x int j while fa x r return r v...