使用並查集來檢測弧的兩端節點是否連通。
#include#include#include#include#includeusing namespace std;
//並查集
class union_set
;union_set::union_set(int len)
void create(const vectordata,const int road_nums);
void output();
~adjlist();
void kruskal();
};//建立鄰接表
void adjlist::create(const vectordata,const int road_nums)
}//列印鄰接表
void adjlist::output()
coutvectormst_pointer_array;//儲存生成樹每一條弧節點的資訊
int node_num=vernode_list.size();//節點數量
union_set us(node_num);
arcnode*f;
//把圖的所有弧輸入進陣列中,順便建立乙個生成樹的鄰接表的頂點節點
for(i=0; ifirst_edge; f!=nullptr; f=f->next)
}//按照權重大小排序
sort(mst_temp.begin(),mst_temp.end());
//根據權重從小到大遍歷弧
for(i=0;ifirst_edge;
delete vernode_list[i];
while(s!=nullptr)
}}int main()
; adjlist mt2;
cout<<"建立鄰接表"
cout
cout
return 0;
}
《大話資料結構》之Kruskal演算法
需要先對邊按權重排序,或者每次要查詢最小權重的邊。同時用類似於陣列鍊錶的方式,記錄每個頂點之間的連線關係。因為需要避免形成環路。typedef struct edge int find int parent,int f return f void minispantree kruskal mgrap...
資料結構與演算法之並查集
並查集結構可以用於 1 檢查兩個元素是否屬於同乙個集合 比如對於圖1這個例子來說,如果我們想要檢查節點d和節點e是否屬於同乙個集合,可以這樣操作 d節點往上找其父節點,一直往上找,直到某個節點的父節點是其本身,此時停止 找到了節點a e節點也按照相同的步驟往上找其父節點,找到節點a 如果這兩個節點往...
資料結構與演算法之並查集
並查集 union find 是一種高效的資料結構,主要的操作有 為方便敘述,把所有元素視作點,元素之間的關係視作線,存在聯絡便存在關係 需要注意的是,這裡的關係應當是1.自反的,2.對稱的,3.傳遞的 所謂合併,便是將兩個點之間 畫 一條線。又上邊的定義不難理解相連的若干點之間互相存在關係,這樣我...