參考張憲超老師《資料結構、演算法及應用》
原理:
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 ...