連通問題的幾種演算法 c

2021-10-23 06:18:54 字數 1523 閱讀 9637

連通問題(connectivity problem)是一種圖論問題.在可以把問題歸結為建立兩元素間聯絡的數學問題中,思維圖的運算可以歸結為安插新的結點和邊,最終完成包含表示這兩元素結點的乙個連通圖。

這個程式從標準輸入讀取小於n的非負整數對序列(對p-q表示「把物件b連線到q」),並且輸出還未聯通的輸入對。程式中使用陣列id,每個元素代表乙個物件,且具有以下性質,當且僅當p和q是連通的,id[p]和id[q]相等。為簡化起見,定義n為編譯時的常數。另一方面,也可以從輸入得到它,並動態地為它分配id陣列。

//   date:2020/4/11

// author:xiezhg5

#include

#define n 10000

intmain

(void

)printf

("%d %d\n"

,p,q);}

return0;

}

如果用這段**替換程式1.1中的while迴圈體,我們就得到乙個同樣滿足程式1.1中說明的程式,但其合併操作的計算時間較短,查詢操作的計算時間更長。這個**中的for迴圈以及後面的if語句指明了在陣列id中p和q是連通的充分必要條件。賦值語句id[i]=j實現合併操作。

//   date:2020/4/11

// author:xiezhg5

#include

#define n 10000

intmain

(void

)return0;

}

這個程式是快速合併演算法的乙個改進。用另乙個陣列sz記錄每個id[i]==i的物件所在樹中的節點數,使得合併操作能夠吧較小的樹連線到較大的樹上,以防止樹中長路徑的增長。

//   date:2020/4/11

// author:xiezhg5

#include

#define n 10000

intmain

(void

)while

(scanf

("%d %d\n"

,&p,

&q)==2)

else

printf

("%d %d\n"

,p,q);}

return0;

}

如果我們用這段**替換程式1.3中的for迴圈,就等分了遍歷的任何路徑的長度。改變的結果是經過的長序列的合併操作之後,樹幾乎完全是扁平的。

//   date:2020/4/11

// author:xiezhg5

#include

#define n 10000

intmain

(void

)while

(scanf

("%d %d\n"

,&p,

&q)==2)

return0;

}

連通問題演算法

書籍 演算法 c語言實現 快速查詢演算法 void connect int p,q while cin p q 我們把合併操作完成到最後,也就是這是乙個只有兩層的樹。或者我們把合併操作簡化,讓查詢變得麻煩一點 void connect1 int q,p int i,j while cin p q a...

Kosaraju演算法解決強連通問題

什麼是強連通分量?在這之前先定義乙個強連通性 strong connectivity 的概念 有向圖中,如果乙個頂點s到t有一條路徑,t到s也有一條路徑,即s與t互相可達,那麼我們說s與t是強連通的。那麼在有向圖中,由互相強連通的頂點構成的分量,稱作強連通分量。首先說一些離散數學相關的結論,由強連通...

演算法I IV,連通問題簡單整理

總結 對於n個物件的連通問題,如果要執行m次合併操作,那麼快速查詢演算法將執行至少m n條指令。bool isconnected 1 int id,int p,int q 當輸入的資料不理想時,快速合併演算法的運算元要遠遠大於m n 2。幸運的是,我們對演算法做乙個簡單地修改就可以保證這樣的最壞情況...