prim及其練習

2022-05-01 04:57:08 字數 1089 閱讀 7921

關於prim,其實我今天才學...

prim其實就是最小生成樹的一種演算法,嚴格每次的找最小邊連到樹上。看書上的**看不懂,於是就自己大膽用堆優化寫prim。

搞了很長時間,經過不寫努力,還是搞出來了。

**如下:

inline void

prim()}}

}

有點簡陋,但個人還是覺得比較理解,也就是每次加進去乙個點,把這個點能連到的點與邊權加進佇列。之後取出最小的邊,判斷是否在樹里,直到最後所有的點都在樹里,prim結束。最小生成樹也就完成了。

不說了,來看一道"裸題":

猛看這道題以為就是練格式的,之後就發現不對了。他要保證的是每個地點有水即不一定要連成乙個樹,還可以在連起來的代價大於打井的代價時選擇打井。連起來的大家都會,不就是連個最小生成樹嘛,但是加上打井就有疑問,怎樣處理好打井與用管道連起來的關係就是這道題的難點所在。

大家可以這樣想:打井之後就不在樹里,那我們最小生成樹就無法完成。這時怎樣將打井和樹聯絡起來就是要思考的問題了。既然打井之後不在樹里,哪我們為什麼不能把它加進樹里,即乙個打井費用就是乙個邊,一共有n打井費用,即n條邊,那就可以再加乙個點,使其他點到這個點的距離就是那個點的打井費用,這樣一共(n+1)個點跑最短路,與n所連的點就是打井的點,最小樹也就完成了。

以下是**:

#includeusing namespace std;

int n,tot,minn,link[100000],m,ans,vis[100000];

struct bian

;bian a[1000000];

inline int read()

while(isdigit(ch))

return x*ff;

}inline void add(int x,int y,int v)

inline void prim()

{ priority_queue>q;

q.push(make_pair(0,m));

while(ans好了,就到這吧!

matlab練習程式(Prim最小生成樹)

演算法步驟 1.任意找一頂點加入樹中。2.尋找所有與樹相鄰的元素,並取其邊權重最小的並且不在樹中的元素入樹。3.繼續第二步,直到所有元素都入樹。效果和kruskal演算法是類似的。已經被標記的元素 k 1 已經標記的元素個數 a 最後產生的最小生成樹 while length q m e for i...

python之if語句及其相關練習

if 要判斷的條件 條件成立的時候,要做的事情 elif 要判斷的條件 else 條件不成立的時候,要做的事情 1.定義乙個變數 age 162.判斷年齡是否滿18歲 if age 18 print 可以進網咖 age else print 未成年 age 練習 判斷成績 score int inp...

python之while語句及其練習

while 條件滿足 滿足條件執行的語句 else 不滿足條件執行的語句 求1 2 100 sum 0 i 0 while i 100 sum i i 1 print sum 練習 使用者登陸系統 for i in range 3 0,1,2 i 0 while i 3 name input 使用者...