最小生成樹(shù)算法之Prim算法
本文介紹了最小生成樹(shù)的定義,Prim算法的實(shí)現(xiàn)步驟,通過(guò)簡(jiǎn)單舉例實(shí)現(xiàn)了C語(yǔ)言編程。
1.什么是最小生成樹(shù)算法?
簡(jiǎn)言之,就是給定一個(gè)具有n個(gè)頂點(diǎn)的加權(quán)的無(wú)相連通圖,用n-1條邊連接這n個(gè)頂點(diǎn),并且使得連接之后的所有邊的權(quán)值之和最小。這就叫最小生成樹(shù)算法,最典型的兩種算法就是Kruskal算法和本文要講的Prim算法。
2.Prim算法的步驟是什么?
這就要涉及一些圖論的知識(shí)了。
a.假定圖的頂點(diǎn)集合為V,邊集合為E.
b.初始化點(diǎn)集合U={u}.//u為V中的任意選定的一點(diǎn)
c.從u的鄰接結(jié)點(diǎn)中選取一點(diǎn)v使這兩點(diǎn)之間的權(quán)重最小,然后將v加入集合U中.
d.從結(jié)點(diǎn)v出發(fā),重復(fù)c步驟,直到V={}.
3.舉個(gè)例子來(lái)說(shuō)明Prim算法的步驟:
一個(gè)簡(jiǎn)單的加權(quán)拓?fù)鋱D如下所示

選取1為初始點(diǎn),則按照上面所示的步驟訪問(wèn)結(jié)點(diǎn)的順序依次次為:

則最終訪問(wèn)結(jié)點(diǎn)的順序:1,3,4,2,5.
4.Prim算法的具體C語(yǔ)言編程實(shí)現(xiàn):
#include <stdio.h>
#include <cstdlib>
#include<memory.h>
const int Max =0x7fffffff;
const int N=50;
int n;
int g[N][N],dis[N],visited[N];
int prim()
{
int i,j;
int pos,min;
int ans=0;
memset(visited,0,sizeof(visited));
visited[1]=1;pos=1;
//assign a value to the dis[N] first
for(i=2;i<=n;i++)
dis[i]=g[pos][i];
for(i=1;i<n;i++)
{
min=Max;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&min>dis[j])
{
min=dis[j];
pos=j;
}
}
printf("The node being traversed is :%d\n",pos);
ans+=min;
printf("The value of ans is %d\n",ans);
//mark the node
visited[pos]=1;
//update the weight
for(j=1;j<=n;j++)
if(visited[j]==0&&dis[j]>g[pos][j])
dis[j]=g[pos][j];
}
return ans;
}
int main()
{
int i=1,j=1;
int ans=0;
int w;
printf("Please enter the number of the nodes:\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)
g[i][j]=0;
else
g[i][j]=Max;
}
printf("Please enter the number of the edges:\n");
int edgenum;
scanf("%d",&edgenum);
int v1,v2;
printf("Please enter the number and the corresponding weight:\n");
for(i=1;i<=edgenum;i++)
{
scanf("%d%d%d",&v1,&v2,&w);
g[v1][v2]=g[v2][v1]=w;
}
ans=prim();
printf("The sum of the weight of the edges is:%d\n",ans);
system("pause");
return 0;
}
5.程序運(yùn)行后的結(jié)果截圖

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- python最小生成樹(shù)kruskal與prim算法詳解
- C++使用Kruskal和Prim算法實(shí)現(xiàn)最小生成樹(shù)
- JS使用Prim算法和Kruskal算法實(shí)現(xiàn)最小生成樹(shù)
- C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)構(gòu)造算法
- Prim(普里姆)算法求最小生成樹(shù)的思想及C語(yǔ)言實(shí)例講解
- 使用C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)求解的簡(jiǎn)單方法
- 詳解圖的應(yīng)用(最小生成樹(shù)、拓?fù)渑判?、關(guān)鍵路徑、最短路徑)
- 最小生成樹(shù)算法C語(yǔ)言代碼實(shí)例
- 淺談算法之最小生成樹(shù)Kruskal的Python實(shí)現(xiàn)
相關(guān)文章
C++獲得本機(jī)所有網(wǎng)卡的IP和MAC地址信息的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇C++獲得本機(jī)所有網(wǎng)卡的IP和MAC地址信息的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
C++實(shí)現(xiàn)馬踏棋盤(pán)(騎士周游)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)馬踏棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
C++實(shí)現(xiàn)順序表的常用操作(插入刪出查找輸出)
實(shí)現(xiàn)順序表的插入,刪除,查找,輸出操作在C語(yǔ)言中經(jīng)常用到。下面小編給大家整理實(shí)現(xiàn)代碼,一起看下吧2016-08-08
C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
C++詳解如何實(shí)現(xiàn)動(dòng)態(tài)數(shù)組
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C++用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列(面試官的小結(jié))
這篇文章主要給大家介紹了關(guān)于C++用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的相關(guān)資料,這是來(lái)自一名面試官的小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
C++通過(guò)msxml調(diào)用webservice示例分享
這篇文章主要介紹了C++通過(guò)msxml調(diào)用webservice示例分享,需要的朋友可以參考下2014-03-03

