最小生成树——Prim算法
来源:互联网 发布:rc4算法 c语言实现 编辑:程序博客网 时间:2024/05/19 20:44
最小生成树
如有不足,欢迎指正。
先来看一张图。
我们要给1-7这7个城市修路,使得任意两个城市之间都可达,并且要使总花费最小,现在告诉你从a城市到b城市修一条路花费为c。
那么问题来了,你要如何使得城市既能两两连通又花费最小呢?
要暴力列举吗?写下任何一种可行的情况去汇总比较?
No,No,No,早已在1957年普里姆同学就已经解决了这个问题,为了纪念小普同学,后来人们就把这种算法叫做普里姆算法,为小普同学鼓掌。
ok,我们就来看看小普同学是如何解决这个问题的。
首先,我们需要一个节点,假设从节点1开始。找出代价最小的一条。1 ,2 ,8 ,10,很明显1和2之间修路代价最小。此时,花费为1.
注:dis[]数组存放的是所有已遍历节点与节点1-7可达的最小值。
现在修建到节点3的最小代价为2,节点4的最小代价为8,节点5的最小代价为10,节点6无路可走,节点7最小代价为8,修建1和3之间的公路。此时,花费为3.
注:已遍历节点dis[]值不再改变。
此时,对于节点4我们既可以修建1->4,也可以修建3->4,但3->4代价最小因此dis[4]=2;同理dis[5]=1;此时,花费为4.
花费为5; sum=1+2+1+1
花费为9;
花费为14;
OK,到现在修路结束,我们的总花费为14.怎么样?看懂了吗?
算法代码部分
#define INF 0x3f3f3f3fint Map[110][110];//记录节点间关系,可达记为1,否则记为0;bool vis[110];//记录节点是否被遍历;int dis[110];void Prim(){ memset(vis,false,sizeof(vis)); int i,j; int sum=0;//记录最小花费 //将1节点与其余节点的可达关系存入到dis数组; for(i=1; i<=n; i++) dis[i]=Map[1][i]; vis[1]=true; for(i=1; i<n; i++) { int m=INF;//记录i节点与其余节点的最短可达代价 int pos; //寻求与i节点有关的代价最小的节点 //若节点存在,pos记录该节点的位置,m记录可达代价 for(j=1;j<=n;j++) { if(!vis[j]&&dis[j]<m) pos=j,m=dis[j]; } if(m==INF) break;//查找结束 vis[pos]=true; sum+=m;//计算到当前为止所花费的代价 for(j=1;j<=n;j++)//更新dis; if(!vis[j]&&dis[j]>Map[pos][j]) dis[j]=Map[pos][j]; } printf("%d\n",sum);}
SDUT上一道最小生成树的题,有空可以做一做。
图结构练习——最小生成树
0 0
- 最小生成树——prim算法
- 最小生成树——prim算法
- 最小生成树算法——Prim
- 最小生成树——Prim算法
- 最小生成树——Prim算法
- 最小生成树——Prim算法
- prim算法模板—最小生成树
- 最小生成树—prim算法
- 最小生成树—Prim算法
- 算法——最小生成树:Kruskal算法、Prim算法
- 最小生成树算法—Kruskal算法和Prim算法
- 构造最小生成树的算法——Prim算法
- 最小生成树——Kruskal算法 和 Prim算法
- 最小生成树—kruskal算法和prim算法
- 最小生成树—Prim算法和Kruskal算法
- 最小生成树—Prim算法和Kruskal算法 (理解)
- Prim — 最小生成树
- 最小生成树 ———prim算法 poj 1258
- Excel2013破解vba工程密码以及工作表保护密码
- 数据结构之图---广度优先遍历---C++实现
- 【C++】实现万年历
- python 计算信息熵和信息增益
- HDU5802 Windows 10[贪心+DFS]
- 最小生成树——Prim算法
- 条款十三:以by reference方式捕获异常
- 动态树-LCT-bzoj2002弹飞绵羊
- ToggleButton布局
- 解读 Joint Cascade Face Detection and Alignment 人脸检测算法
- SDUT OJ 2506 数据结构实验——完美网络
- Android Camera驱动中添加新的mode
- 前端需掌握的知识
- OJ3364数据结构实验之图论八:欧拉回路