問題1:.圖怎麼生成樹html
問題1解決方案:
參考了博客圖的生成樹(森林)(克魯斯卡爾Kruskal算法和普里姆Prim算法)、以及並查集的使用node
如何求連通圖的最小生成樹?git
構造最小生成樹的算法不少,其中多數算法都利用了一種稱之爲 MST 的性質。算法
MST 性質:設 N = (V, E) 是一個連通網,U 是頂點集 V 的一個非空子集。若邊 (u, v) 是一條具備最小權值的邊,其中u∈U,v∈V-U,則必存在一棵包含邊 (u, v) 的最小生成樹。數組
普里姆 (Prim) 算法。網絡
算法思想:數據結構
一、設 N=(V, E) 是連通網,TE 是N 上最小生成樹中邊的集合。初始令 U={u0}, (u0屬於V ), TE={ }。oop
二、在全部 u屬於U, v屬於V-U 的邊 (u, v)屬於E 中,
找一條代價最小的邊 (u0, v0)。
將 (u0, v0) 併入集合 TE,同時 v0 併入 U。學習
三、重複上述操做直至 U=V 爲止,則 T=(V, TE) 爲 N 的最小生成樹。
總得來講,普里姆算法就是以樹爲單位,找最小的權邊,特色是針對無向圖!只和頂點有關,和邊無關,適用於稠密圖。算法時間複雜度爲 O(n^2)spa
如圖:普里姆算法求最小生成樹
初始令 U={u0}, (u0屬於V ), TE={ }。
在全部 u屬於U, v屬於V-U 的邊 (u, v)屬於E 中,找一條代價最小的邊 (u0, v0)。將 (u0, v0) 併入集合 TE,同時 v0 併入 U。
重複上述操做直至 U=V 爲止,則 T=(V, TE) 爲 N 的最小生成樹。
繼續
最後,遍歷完
Prim算法的實現
頂點集合如何表示?最小邊如何選擇?一個頂點加入U集合如何表示?以下面的例子:
當U集合中加入一個新頂點時,V-U集合中的頂點到U的最小代價邊可能會更新,k 表明最終選擇的頂點,k=3,表明選擇是v3這個頂點,由於1-3代價是最小的=1
選取了 v3,以後,繼續以最新的樹爲單位,來找最小的權值邊,經過看和哪一個頂點鏈接。
k=6,表明選擇是v6這個頂點,由於3-6代價是最小的=4,在全部的和最新的樹鄰接的頂點中,權值最小的邊。
選取 v6以後
繼續以最新的樹爲單位,找臨近的頂點,看哪條邊的權值最小,找到6-4這條邊,權值=2
新的樹如圖
繼續以最新的樹爲單位,找臨近的頂點,看哪條邊的權值最小,找到3-2這條邊,權值=5
新的樹如圖
繼續以最新的樹爲單位,找臨近的頂點,看哪條邊的權值最小,找到2-5這條邊,權值=3
直到全部頂點所有併入生成樹以後,程序結束
問題1:.pp15.7要建立一個加權無向圖,具體要怎麼實現
問題1解決方案:增長邊時在邊中定義兩個int值,分別表示價格和最短路徑
錯題2
Since a heap is a binary search tree, there is only one correct location for the insertion of a new node, and that is either the next open position from the left at level h or the first position on the left at level h+1 if level h is full.
A .True
B .Flase
選B
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 8/8 | |
第二週 | 500/500 | 1/2 | 15/ 23 | |
第三週 | 802/1302 | 1/3 | 12/35 | |
第四周 | 1530/2832 | 2/5 | 15/50 | |
第五週 | 1165/3997 | 1/6 | 10/60 | |
第六週 | 1169/5166 | 1/7 | 15/75 | |
第七週 | 843/6039 | 1/8 | 15/90 | |
第八週 | 1804/7843 | 2/10 | 30/120 | |
第九周 | 1493/9336 | 1/11 | 15/135 |