最小生成树prim算法
来源:互联网 发布:csgo淘宝买激活码 编辑:程序博客网 时间:2024/05/22 04:28
最小生成树概念:给你n个点,两两点之间相连,现在要你找到n-1个边使其每条边的权值最小。
就以poj1258为例解释
首先定义一个map[]数组用来存放农场与农场之间的权值,visited[]数组用来存放已经访问的农场,low[]数组用来存放与这个农场相连的所有农场中距离最近的距离。
直接上代码:
就以poj1258为例解释
首先定义一个map[]数组用来存放农场与农场之间的权值,visited[]数组用来存放已经访问的农场,low[]数组用来存放与这个农场相连的所有农场中距离最近的距离。
直接上代码:
#include <stdio.h>#include <string.h>#define MaxInt 0x3f3f3f3f#define N 110int map[N][N],low[N],visited[N];int n;int prim(){ int i,j,pos,min,result=0; memset(visited,0,sizeof(visited)); visited[1]=1;pos=1;//首先随便找一个农场作为起点; for(i=1;i<=n;i++) if(i!=pos) low[i]=map[pos][i];//给low数组赋值; for(i=1;i<n;i++) { min=MaxInt; for(j=1;j<=n;j++) if(visited[j]==0&&min>low[j]) { min=low[j];pos=j; }//找出最小的距离并用pos标记; result+=min;//距离相加; visited[pos]=1;//标记第pos个农场已经被访问; for(j=1;j<=n;j++) if(visited[j]==0&&low[j]>map[pos][j]) low[j]=map[pos][j];//更新low数组; } return result;}int main(){ int i,j,ans; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&map[i][j]); } ans=prim(); printf("%d\n",ans); } return 0;}
最小生成树原理:
用visit[]数组存放已经被访问的顶点,用low[]数组存放最短距离,只要是不断地更新visit数组和low数组当所有的点都被访问时就会得到最短距离,即最短路径。
1 0
- Prim最小生成树算法
- 最小生成树Prim算法
- 最小生成树Prim算法
- 最小生成树----Prim算法
- 最小生成树Prim算法
- Prim 最小生成树算法
- 最小生成树:Prim算法
- Prim算法 ----最小生成树
- 最小生成树-prim 算法
- 最小生成树(prim算法)
- 最小生成树 prim算法
- 最小生成树 prim算法
- Prim最小生成树算法
- 最小生成树prim算法
- 最小生成树--prim算法
- 最小生成树Prim算法
- 最小生成树(Prim算法)
- 最小生成树----Prim算法
- HDU 2041
- Labview学习笔记——如何用按钮来控制某控件(例如文本控件)的显示与隐藏
- C语言中缓冲区的分类与刷新
- C# Winform中实现主窗口打开登录窗口关闭的方法
- 115个Java面试题和答案——终极列表(下)
- 最小生成树prim算法
- 怎么在android app中使用STL库
- onerror
- Mathematical Morphology 数学形态学
- [LintCode] 螺旋矩阵 Spiral Matrix
- 如何获得腾讯FLASH视频链接或下载到本地
- 【POJ1819】Disks——几何工具
- wust 1599弗洛伊德
- ListView工作原理以及优化