C++實(shí)現(xiàn)圖的鄰接矩陣及其時(shí)間復(fù)雜度分析

????小編在上篇簡(jiǎn)書簡(jiǎn)單介紹了有關(guān)圖的一些基本的性質(zhì),那如何去存儲(chǔ)圖呢?首先,圖的頂點(diǎn)之間的關(guān)系是m:n,即任何兩個(gè)頂點(diǎn)之間都可能存在關(guān)系(邊),無(wú)法通過(guò)存儲(chǔ)位置表示這種任意的邏輯關(guān)系,所以,圖無(wú)法采用順序存儲(chǔ)結(jié)構(gòu)??紤]圖的定義,圖是由頂點(diǎn)和邊組成的,分別考慮如何存儲(chǔ)頂點(diǎn)、如何存儲(chǔ)邊。圖的鄰接矩陣的存儲(chǔ)方式是用兩個(gè)數(shù)組來(lái)實(shí)現(xiàn)的,一個(gè)一維數(shù)組存儲(chǔ)頂點(diǎn)信息,一個(gè)二維數(shù)組存儲(chǔ)線(無(wú)向圖)或?。ㄓ邢驁D)的信息。

????(1)無(wú)向圖的鄰接矩陣

????假設(shè)圖G=(V,E)有n個(gè)頂點(diǎn),則鄰接矩陣是一個(gè)n×n的方陣,定義為:

無(wú)向圖表示
無(wú)向圖例子

? ??無(wú)向圖鄰接矩陣的特點(diǎn)為:主對(duì)角線一定為0且為對(duì)稱矩陣

????求無(wú)向圖頂點(diǎn)的度就是求鄰接矩陣第i行或第j列非零元素的個(gè)數(shù)

????判斷頂點(diǎn)i和j是否存在邊就是判斷Arc[i][j]是否為1

????求頂點(diǎn)i的所有鄰接點(diǎn)就是將數(shù)組中第i行重新掃描一遍,若Arc[i][j]為1,則頂點(diǎn)j為頂點(diǎn)i的鄰接點(diǎn)

????(2)有向圖的鄰接矩陣

????假設(shè)圖G=(V,E)有n個(gè)頂點(diǎn),則鄰接矩陣是一個(gè)n×n的方陣,定義為:

有向圖表示
有向圖舉例

????有向圖的鄰接矩陣不一定對(duì)稱,比如完全有向圖。

????有向圖中,頂點(diǎn)i的出度為第i行元素之和,入度為第j列元素之和【這里的有向圖中是指邊還未添加權(quán)值,默認(rèn)為1】

????代碼如下:

C++實(shí)現(xiàn)鄰接矩陣
運(yùn)行截圖

????接下來(lái)我們簡(jiǎn)單分析下該算法的時(shí)間復(fù)雜度。

????從上述的代碼截圖中,我們可以發(fā)現(xiàn)程序執(zhí)行步驟最多的為CreateMGraph這個(gè)函數(shù),而該函數(shù)程序執(zhí)行步驟最多為3個(gè)for循環(huán)語(yǔ)句。

for循環(huán)

????第一個(gè)for循環(huán)語(yǔ)句循環(huán)n次【n為輸入的頂點(diǎn)個(gè)數(shù)】,第二次for循環(huán)語(yǔ)句循環(huán)n的平方次,第三次for循環(huán)語(yǔ)句循環(huán)e次【e為圖中的邊數(shù)】,在這里我們先忽略其它賦值語(yǔ)句執(zhí)行的次數(shù),得到的執(zhí)行步數(shù)為n^2+n+e。當(dāng)n越來(lái)越大時(shí),n^2將開始占據(jù)主導(dǎo)地位,其它項(xiàng)目也可以忽略,因此我們就可以把代表程序總執(zhí)行步數(shù)的記為O(n^2)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容