8 2 1再談最小生成樹 用堆

2021-07-28 13:29:58 字數 1460 閱讀 7793

#includeusing namespace std;

int dis[7],book[7]=;//book陣列用來記錄哪些頂點已經放入生成樹中

int h[7],pos[7],size;//h用來儲存堆,pos用來儲存每個頂點在堆中的位置,size為堆的大小

//交換函式,用來交換堆中的兩個元素的值

void swap(int x,int y)

//向下調整函式

void siftdown(int i)

else

t=i;

//如果它有右兒子,再對右兒子進行討論

//由於堆是完全二叉樹,所以堆中任意乙個結點的右孩子(存在的情況下)編號均滿足i*2+1<=size

if(i*2+1<=size)

} //如果發現最小的結點編號不是自己,說明子結點中有比父結點更小的

if(t!=i)

else

flag=1;//否則說明當前的父結點已經比兩個子結點都要小了,不需要再進行調整了 }

}//向上調整函式

void siftup(int i)

//這裡是無向圖,所以需要將所有的邊反向再儲存一遍

for(i=m+1;i<=2*m;i++)

//開始使用鄰接表儲存邊

for(i=1;i<=n;i++)

for(i=1;i<=2*m;i++)

//prim核心部分開始

//將1號頂點加入生成樹

book[1]=1;//這裡用book來標記乙個頂點已經加入生成樹

count++;

//初始化dis陣列,這裡是1號頂點到其餘各個頂點的初始距離

dis[1]=0;

for(i=2;i<=n;i++)

k=first[1];

while(k!=-1)

//初始化堆

size=n;

for(i=1;i<=size;i++)

for(i=size/2;i>=1;i--)

pop();//先彈出乙個堆頂元素,因為此時堆頂是1號頂點

while(countw[k])

k=next[k];

} }

cout<<"該圖的最小生成樹的邊的總長度之和最短為: "

return 0; }

/*使用堆優化思路:

1、需要用到3個陣列

2、陣列dis用來記錄生成樹到各個頂點的距離

3、陣列h是乙個最小堆,堆裡面儲存的是頂點編號。注意:這裡並不是按照頂點編號的大小來建立最小堆,

而是按照頂點在陣列dis中所對應的值來建立這個最小堆

4、陣列pos用來記錄每個頂點在最小堆中的位置

5、借助堆,每次選邊的時間複雜度是o(logm),然後使用鄰接表來儲存圖的話,整個演算法的時間複雜度會降

低到o(mlogn)

*/

8 2 2再談最小生成樹 用陣列

includeusing namespace std int main 這裡對book陣列進行了初始化 int inf 99999999 int count 0,sum 0 count用來記錄生成樹中頂點的個數,sum用來儲存路徑之和 讀入n和m,n表示頂點個數,m表示邊的條數 cout 請分別輸入...

再談最小生成樹(Prim演算法)

prim演算法用最小堆,圖的鄰接矩陣儲存法,實現。時間複雜度大大優化,按照鄙人的理解,其原理大概是用圖的鄰接矩陣儲存法儲存圖,然後建立乙個最小堆,先弄乙個最小生成樹,剛開始只有乙個元素,即1號元素,最小堆的頂部元素到最小生成樹的距離即為最小堆到最小生成樹的最小距離,然後取出最頂部元素,將最頂部元素放...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...