最小生成樹(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ù)渑判颉㈥P(guān)鍵路徑、最短路徑)
- 最小生成樹(shù)算法C語(yǔ)言代碼實(shí)例
- 淺談算法之最小生成樹(shù)Kruskal的Python實(shí)現(xiàn)
相關(guān)文章
Qt Design Studio創(chuàng)建工程的實(shí)現(xiàn)方法
Qt Design Studio它允許設(shè)計(jì)人員和開(kāi)發(fā)人員使用通用的設(shè)計(jì)、開(kāi)發(fā)、分析和調(diào)試工具在不同的開(kāi)發(fā)平臺(tái)上共享一個(gè)項(xiàng)目,本文主要介紹了Qt Design Studio創(chuàng)建工程的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下2022-05-05
C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行
這篇文章主要為大家詳細(xì)介紹了C++ Clock類模擬實(shí)現(xiàn)鬧鐘運(yùn)行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
嵌入式C語(yǔ)言查表法在項(xiàng)目中的應(yīng)用
今天小編就為大家分享一篇關(guān)于嵌入式C語(yǔ)言查表法在項(xiàng)目中的應(yīng)用,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
C語(yǔ)言結(jié)構(gòu)體數(shù)組常用的三種賦值方法(包含字符串)
C語(yǔ)言只有在定義字符數(shù)組的時(shí)候才能用“=”來(lái)初始化變量,其它情況下是不能直接用“=”來(lái)為字符數(shù)組賦值的,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體數(shù)組常用的三種賦值方法,需要的朋友可以參考下2022-06-06
C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++鏈表實(shí)現(xiàn)通訊錄設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

