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 輸出格式 輸出包含乙個數,即最小生成樹...