Prim算法详解
Prim算法是用來(lái)尋找一個(gè)聯(lián)通圖的最小生成樹(shù)的算法,是數(shù)據(jù)結(jié)構(gòu)中一個(gè)十分經(jīng)典的算法,與他齊名的還有了克魯斯卡爾算法,將會(huì)在下一篇
中提到。
Prim算法思想(歸并頂點(diǎn)):
首先給定一個(gè)起始點(diǎn),例如我們以A為起始點(diǎn),選擇與它關(guān)聯(lián)的具有最小權(quán)值的邊,將其加入到生成樹(shù)的集合頂點(diǎn)U中去(這里我們用visited[i] = true 來(lái)實(shí)現(xiàn));
然后我們進(jìn)行N - 1次循環(huán)從U中 及 非U中選擇兩個(gè)聯(lián)通的且具有最小權(quán)值的頂點(diǎn),把非U的頂點(diǎn)加入U(xiǎn)中,直到所有頂點(diǎn)都加入到U中為止。
實(shí)例圖:
這個(gè)圖較為清晰直觀的分析了Prim算法的思想。
代碼如下:
1.數(shù)據(jù)及結(jié)構(gòu)的定義:
2.建立鄰接矩陣:
void create_Graph (Graph &G) {char v1,v2;int weight; //權(quán)值;cout<<"please key in the vernum & arcnum"<<endl;cin>>G.vernum>>G.arcnum;cout<<"please key in all the vertexs"<<endl;for (int i = 0;i < G.vernum;i++)cin>>G.ver[i];cout<<"please key in the v1 & v2 & weight"<<endl;for (int ii = 0; ii < G.vernum;ii++)for (int jj = 0; jj < G.vernum;jj++)G.martrix[ii][jj] = INITFITE; //初始化矩陣的時(shí)候?qū)⒕仃嚨闹蒂x成無(wú)窮大。for (int ii = 0;ii < G.arcnum;ii++){cin>>v1>>v2>>weight;int i = locate(G,v1);int j = locate(G,v2);//cout<<i<<" "<<j<<endl;G.martrix[i][j] = weight;G.martrix[j][i] = weight;} }3.Prim算法:
bool visited[N];void Prim(Graph &G,char ch) {int v,w;v = locate(G,ch);visited[v] = true;int min = 1000000;for (int i = 0;i < G.vernum;i++)//為第一個(gè)頂點(diǎn)找到鄰接點(diǎn){if (!visited[i]) { closedge[i].data = G.ver[v]; //將第i的點(diǎn)的上一個(gè)鄰接點(diǎn)暫時(shí)賦成G.ver[v];closedge[i].lowcost = G.martrix[v][i];if (closedge[i].lowcost < min) //判斷并找到最小的權(quán)值{min = closedge[i].lowcost;w = i; //記錄最小權(quán)值的下標(biāo)}}}cout<<closedge[w].data<<" "<<G.ver[w]<<" "<<closedge[v].lowcost; //輸出!!cout<<endl;//visited[w] = true;for (int i = 0;i < G.vernum - 2;i++)//n-1次循環(huán)找到剩余的n-1個(gè)點(diǎn){visited[w] = true;//將G.ver[w]加入U(xiǎn);v = w;min = 1000000;for (int j = 0;j < G.vernum;j++){if (!visited[j]){if (G.martrix[v][j] < closedge[j].lowcost) //關(guān)鍵(核心思想):看G.ver[w]的引入是否改變了到達(dá)其他頂點(diǎn)的最小值,如果改變了就從新賦值,否則不變。{closedge[j].data = G.ver[v];closedge[j].lowcost = G.martrix[v][j];}if (closedge[j].lowcost < min){min = closedge[j].lowcost;w = j;}} }cout<<closedge[w].data<<" "<<G.ver[w]<<" "<<closedge[v].lowcost;cout<<endl; } }4.主函數(shù)
int main(){Graph G;create_Graph(G);for (int i = 0; i < G.vernum;i++){for (int j = 0; j < G.vernum;j++)printf("%8d",G.martrix[i][j]);cout<<endl;}Prim(G,'A');return 0; }Prim 算法在考研中占有相當(dāng)大的比重,要求熟練掌握編碼!!
總結(jié)
- 上一篇: 数据结构之基于顺序表的插入排序
- 下一篇: 迪杰斯特拉算法详解