鄰接表實現PRIM演算法 C

2021-07-09 05:01:20 字數 1288 閱讀 3588

參考張憲超老師《資料結構、演算法及應用》

原理:

g=是乙個連通的帶權無向圖。prim演算法通過不斷地增加生成樹的頂點來得到最小生成樹。在演算法的任一時刻,一部分頂點已經新增到生成樹的頂點集合中,而其餘頂點尚未加到生成樹中。此時,prim演算法通過選擇邊,使得的權值是所有u(起點)在生成樹中,但v(終點)不在生成樹中的邊的權值最小者

,從而找到新的頂點v把她新增到生成樹中。

詳細步驟:

1)初始狀態,u=,te={}。其中,u1是圖頂點集合的某一頂點。

2)在所有u∈u,v∈v-u的邊(u,v)中尋找代價最小的邊(u',v'),並納入集合te中;同時將v'納入集合u中。確保這一過程中不產生迴路。

3)如果u=v,則演算法結束;否則重複2.

**實現:

#include#includeusing namespace std;

class edge

edge()

};//鄰接表

class listnode

listnode(const int& lv,const int& en,const int & w,listnode* nextval=null)

};class headnode

void removeall()

} ~headnode()

};class listgraph

return tmpedge;

} edge nextedge(edge oneedge)

return tmpedge;

} void setedge(int strt,int end,int wt)

//邊在邊結點中已存在

if(tmplst->next->listver==end)

//邊在邊結點中不存在,但在邊表中其後存在其他邊

if(tmplst->next->listver>end)

}void deledge(int start,int end)

} void show(int v)

} return; }

void show()

neighbor[s]=-1;//將已加入到生成樹的點的最近鄰設定成-1

for(i=1;i-1)

}if(v>=0)}}

}

deleteneighbor;

deletenearest;

cout<<"after prim(from v"<

prim演算法 鄰接矩陣 鄰接表版

prim演算法和dijkstra演算法差不多,只不過前者每次併入乙個離當前集合最近的點,乙個併入離原點最近的點 前提都是vis u false prim演算法從哪個點開始都可以,所以不需要引數,這裡預設起點是0 返回生成樹權值之和。const int maxn 500 10 const int in...

鄰接矩陣實現Prim演算法

prim是尋找最小生成樹的演算法,本文利用鄰接矩陣,乙個比較方便的方式來進行prim演算法。鄰接矩陣是儲存有向或無向圖的方式,若不帶權,一般用 0 或 inf 表示未連線,用 1 表示連線。如果帶權,可以用乙個矩陣來表示,1是未連線,若連線,則數值等於權值 也可以用兩個矩陣分別表示連線情況和權值。本...

C 實現鄰接表

對於無向圖 v0,v1 v1,v2 v2,v3 v0,v2 對應的鄰接表表示就是 在 中,你要單獨對v1 v2 v3建立一種結構體型別。在對後面的節點0,1,2,3建立一種結構體型別 1 include 2 include3 define vertex 4 4using namespace std ...