對於prim的乙個有趣但有點奇怪的想法

2022-08-04 00:24:17 字數 1595 閱讀 5183

prim演算法找最小生成樹適用於無向圖,對於有向加權圖會產生錯誤。

比如1->2,8

1->3,8

2->3,4

3->2,3

最小生成樹1->2->3

而不是3->2;

這是因為2,3之間相互的邊在prim演算法中無法判斷,或者根本意識不到3->2這條邊。

我突然想到如果在判斷2的最小邊時將以2為入度的邊的也加入判斷,這樣就可以遍歷到3-》2邊,但這樣又會產生乙個問題,記錄下的邊是2->3 ,3。

這樣就相當於記錄了一條方向相反的邊,這條邊是不存在的。但我們可以在記錄這樣的邊時做個標記,在儲存這種邊時在進行改正。但這樣有些麻煩,不如再寫乙個kruskal.

(其實我是偷懶,寫prim時生成的圖是有向圖,但實在不想改太多,所以想了這麼個辦法來解決,但這個想法好像可以讓prim來檢測有向圖,插一段**,標記部分沒寫,如果有錯誤的地方或者不合適的注釋,還請各位指出,鄙人不勝感激)

參考:

edge* graph::prim(int

cur)

int *weight = new

int[this->vertexnum];

this->minpath = new edge[this->vertexnum - 1];//

儲存最小生成樹的邊

int *neighbor = new

int[this->vertexnum];//

記錄與i點距離最近的頂點的編號,應該是找到該節點的前驅節點標記

bool* u = new

bool[this->vertexnum];//

已加入最小生成樹的節點,規定節點在該陣列中為true;不在為fasle

for (int i = 0; i < this->vertexnum; i++)

u[cur] = true

;

for (int i = 0; i < this->vertexnum; i++)

int index;//

記錄最小權值邊所連線的頂點

neighbor[cur] = -1;//

for (int i = 1; i < this->vertexnum; i++)

}u[index] = true

;

if (neighbor[index] >= 0

)

for (int j = 0; j < this->vertexnum; j++) }}

return

this->minpath;}/*

prim:

neighbor記錄的是尋找到每個節點的前驅節點。如果在第二個for迴圈裡沒有找到以第二個為線索的後繼節點,則下乙個找到的節點必然以第乙個

節點為線索。(初始頂點已知,第乙個for迴圈以初始頂點為線索找到第二個頂點,第二個for迴圈則以第二個頂點為線索,尋找是否有符合條件的第三個

頂點,如果有,將第三個頂點的前驅(線索)記錄到neighbor中,同時跟新權重(weight)值,使得下一次尋找時能夠找到第三個頂點。

關於weight,並不是屬於初始頂點到各個頂點的權重值,但它初始記錄這些值,在之後的更新中一直來記錄最小權值。

*/

乙個有趣的故事

我有乙個老同學,乙個人娶了兩個老婆,一中一外。這件事情在紐約的華人裡面非常轟動,老同學自己從來不迴避,他經常出沒各種派對,嘴裡叼著雪茄菸,手裡拿著香檳說 我他媽得做個床,能睡三個人的床連他媽美國都沒賣的。老同學的大老婆是個美國人,在華爾街做事情,而且非常出色 二老婆是上海人,我沒見過本人,只看過 漂...

乙個有趣的題目

看到qq群裡有人發了乙個很有意思的題目 如果 昨天是明天就好了,那麼今天就是周五了,請問句中的今天是週幾?晚上睡覺的時候又想起這個問題,發現這個問題還大有文章,其實問題的關鍵在於上面的綠色背景的如果兩個字,既然是如果,那麼思維就可以完全發散,如果時間可以穿越,明天真的可以穿越到昨天,那麼今天其實就是...

乙個有趣的統計

出於好玩的態度,我從4月起開始持續對我的部落格每日訪問情況在excel中做了個記錄,記錄的格式如下 今天頭腦中突然閃過乙個念頭,對週末和非週末的訪問情況做個統計,於是寫了個模組 sub statistic dim i as integer dim visitdatestr as string dim...