prim演算法 優化前O(n ) 優化後O(n k)

2021-07-09 20:38:11 字數 1655 閱讀 6700

1.演算法思想

圖採用鄰接矩陣儲存,貪心找到目前情況下能連上的權值最小的邊的另一端點,加入之,直到所有的頂點加入完畢。

2.演算法實現步驟

設圖g=(v,e),其生成樹的頂點集合為u。

(1)把v0放入u。

(2)在所有u∈u,v∈v-u的邊(u,v)∈e中找一條最小權值的邊,加入生成樹。

(3)把(2)找到的邊的v加入u集合。如果u集合已有n個元素,則結束,否則繼續執行(2)。

最後得到最小生成樹u=

#include

#include

using

namespace

std;

#define vmax 200

int w[vmax][vmax],i,j,k,v,e;

void prim(int v0)

if (min!=0x7fffffff)

}}int main()

prim(1);

return

0;}

3.演算法的關鍵與優化

我們很容易就可以發現prim演算法的關鍵:每次如何從生成樹t到t外的所有邊中,找出一條最小邊。例如,在第k次前,生成樹t中已有k個頂點和(k-1)條邊,此時,t到t外的所有邊數為k*(n-k),當然,包括沒有邊的兩頂點我們記權值為「無窮大」的邊在內,從如此多的邊中查詢最短邊,時間複雜度為o(k(n-k)),顯然無法滿足我們的期望。

我們來看o(n-k)的方法:假定在進行第k次前已經保留著從t中到t外的每乙個頂點(共n-k個)的各一條最短邊,在進行第k次時,首先從這(n-k)條最短邊中,找出一條最最短邊(它就是從t到t外的最短邊),假設為(vi,vj),此步需要進行(n-k)次比較;然後把邊(vi,vj)和頂點vj併入t中的邊集te和頂點集u中,此時,t外只有n-(k+1)個頂點,對於其中的每個頂點vt,若(vj,vt)邊上的權值小於原來儲存的從t中到vt的最短邊的權值,則用(v,vt)修改之,否則,保持原最小邊不變。這樣就把第k次後t中到t外的每乙個頂點vt的各一條最短邊都保留下來了,為第(k+1)次做好了準備。這樣,prim的總時間複雜度為o(n²)。

【樣例輸入】

6 10

1 2 10

1 5 19

1 6 21

2 3 5

2 4 6

2 6 11

3 4 6

4 5 18

4 6 14

5 6 33

【樣例輸出】

50 優化後:

#include

using

namespace

std;

#define mxn 1000

intmap[mxn][mxn],cost[mxn],visit[mxn],i,j,n,m,x,y,v;

int prim()

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

if (map[1][i]!=0)

cost[i]=map[1][i];

visit[1]=true;

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

return ans;

}int main()

}printf("%d",prim());

return

0;}

SPFA演算法及前向星優化

分類 其他 2010 11 21 22 29 191人閱讀收藏 舉報演算法 優化output algorithm input儲存 先說說spfa演算法 spfa演算法 來自 nocow 演算法簡介 spfa shortest path faster algorithm 是 bellman ford演...

綜合架構 前優化

把以下內容vi到123.sh裡 sh 123.sh即可執行 1優化yum源為阿里雲映象源 curl o etc yum.repos.d centos base.repo curl o etc yum.repos.d epel.repo yum install y vim wget net tools...

最小生成樹 prim演算法的堆優化

如題,給出乙個無向圖,求出最小生成樹,如果該圖不連通,則輸出orz 輸入格式 第一行包含兩個整數n m,表示該圖共有n個結點和m條無向邊。n 5000,m 200000 接下來m行每行包含三個整數xi yi zi,表示有一條長度為zi的無向邊連線結點xi yi 輸出格式 輸出包含乙個數,即最小生成樹...