prim演算法的執行非常類似於尋找圖的最短通路的dijkstra演算法。prim演算法的特點是集合a中的邊總是只形成單棵樹。如圖5所示,陰影覆蓋的邊屬於正在生成的樹,樹中的結點為黑色。在演算法的每一步,樹中的結點確定了圖的乙個割,並且通過該割的輕邊被加進樹中。樹從任意根結點r開始形成並逐漸生長直至該樹跨越了v中的所有結點。在每一步,連線a中某結點到v-a中某結點的輕邊被加入到樹中,由推論2,該規則僅加大對a安全的邊,因此當演算法終止時,a中的邊就成為一棵最小生成樹。因為每次新增到樹中的邊都是使樹的權盡可能小的邊,因此上述策略也是貪心的。
有效實現prim演算法的關鍵是設法較容易地選擇一條新的邊新增到由a的邊所形成的樹中,在下面的偽**中,演算法的輸入是連通圖g和將生成的最小生成樹的根r。在演算法執行過程中,不在樹中的所有結點都駐留於優先順序基於key域的佇列q中。對每個結點v,key[v]是連線v到樹中結點的邊所具有的最小權值;按常規,若不存在這樣的邊則key[v]=∞。域p[v]說明樹中v的「父母」。在演算法執行中,generic-mst的集合a隱含地滿足:
a=-q}
當演算法終止時,優先佇列q為空,因此g的最小生成樹a滿足:
a=}**如下:
#include#include#includeusing namespace std;
#define undefine -1
//此處prim演算法的圖為無向圖
struct edge
;struct vertex
;struct graph
;struct primedge;};
class mstprim
;mstprim::mstprim(char *vertex,int vernum,char adj[2],int *weight,int adjnum)
for(i = 0;i < adjnum;i++) }
void mstprim::priminsert(int source,int dest,int weight)
else
edge* newnode = new edge;
newnode->verno = dest;
newnode->weight = weight;
newnode->next = temp->next;
temp->next = newnode; }}
int mstprim::primfindkey(char key)
return i;
}int mstprim::primextractmin(int *key,bool *visited,int length)
minno = i;
for(i = minno + 1;i < length;i++)
return minno;
}void mstprim::primspantree()
key[0] = 0; //初始化為0,感覺和下面都可以
//key[0] = primgraph->vertexs[0].adj->weight; //初始化第乙個數值
//visited[0] = true;
for(i = 0;i < length;i++)
else if(visited[next] == false) //由於鄰接鍊錶是按照權重從小到達進行排序的,第乙個存在邊且被訪問的節點一定是離已存在節點中最近的邊
temp = temp->next;
} visited[next] = true; }}
void mstprim::primspantreeoutput()
最小生成樹(prim演算法)
最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...
最小生成樹 Prim演算法
prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...
最小生成樹 prim 演算法
一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...