題意:有n個城鎮,已經現在已經有m條道路,每條道路連線兩個城鎮(可以重複連線),目標是使任意兩個城鎮間都可以實現交通(不一定有直接的道路相連,只要互相間接通過道路可達即可),求最少還需要建設多少條道路。本題看上去像圖的連通性問題,和圖論有關,但是其實不必用圖論的那些演算法解決。(說這話是因為這是並查集配的練習…)
並查集是一種用來管理元素分組情況的資料結構,主要用於處理一些不相交集合的合併問題。常見的有求連通子圖、求最小生成樹的 kruskal 演算法和求最近公共祖先(least common ancestors, lca)等。
基本的並查集結構由乙個整數型的陣列和兩個函式構成。陣列pre記錄了每個點的前導點是什麼,函式find是查詢,join(unite)是合併。
傳送一下大神們的總結:
說回這道題,用並查集表示每個城鎮的連通情況,具有相同根節點(同一組)的節點視為有道路連通,構造好原始的m條道路後,只需判斷結點1和其他結點 i 是否在同一子集裡,如果不在同一組,則新建一條道路並合併1和 i 。(方法不唯一)
#include
#include
#include
using
namespace
std;
const
int maxn = 1005;
int n, pre[maxn];
void init() //每個結點單獨成樹
int find_root(int x) //找到x所在集合的根節點
return r;
}void unite(int x, int y) //合併x和y所在子集
int main()
int first = find_root(1), tmp;
for (int i = 2; i <= n; ++i) //直到1能連線所有結點
}cout
<< ans << endl;
}return
0;}
演算法複雜度:o(mα(n)),這裡的 α 是 ackerman 函式的某個反函式,只需知道是乙個很小的數就可以了。
耗時:46ms
並查集 HDU 1232 暢通工程
problem description 某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省 暢通工程 的目標是使全省任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要互相間接通過道路可達即可 問最少還需要建設多少條道路?input 測試輸入包含若干測試用例。...
HDU1232 暢通工程 並查集問題
所謂並查集,就是指查詢無向圖或是有向圖中各個點的聯通與否,其中可以分為兩個部分,乙個是根節點的尋找,乙個是聯通過程。首先在根節點的尋找中使用儲存前驅節點資訊的數pre,逐層詢問,直到最上的點 如果兩個點的最上的點不同那麼就需要將他們聯通,聯通的方法就是將其中乙個最上點的前驅節點轉為另乙個最上點,這要...
hdu1232 暢通工程 並查集入門
推薦乙個有趣的並查集講解文章點這裡 hdu1232 暢通工程 講解都在 中,很好理解 includeusing namespace std int fa 1100 fa陣列記錄每個點的父親 int lcount int find int x int j while fa x r return r v...