最小生成树prim算法(贪心)
2014-10-09 19:27
274 查看
一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小。综合以上两个概念,我们可以得出:构造连通网的最小代价生成树,即最小生成树(Minimum
Cost Spanning Tree)。
Prim算法也是利用贪心算法来解决最小生成树。
最小生成树MST性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,
其中u∈U,v∈V-U,则必存在一颗包含边(u,v)的最小生成树。
prim算法过程为:
假设N=(V,{E})是连通图,TE是N上最小生成树中边的集合。算法从U={u0}(u0∈V),TE={}开始,
重复执行下述操作:
在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0 并入U,直至U=V为止。
此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。
prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关。
借用一下图
举例说明poj
1258 Agri-Net
Cost Spanning Tree)。
Prim算法也是利用贪心算法来解决最小生成树。
最小生成树MST性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,
其中u∈U,v∈V-U,则必存在一颗包含边(u,v)的最小生成树。
prim算法过程为:
假设N=(V,{E})是连通图,TE是N上最小生成树中边的集合。算法从U={u0}(u0∈V),TE={}开始,
重复执行下述操作:
在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0 并入U,直至U=V为止。
此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。
prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关。
借用一下图
举例说明poj
1258 Agri-Net
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int Max=100000000; const int N=110; int map ,low ,visited ;//创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问 int prim(int n) { int pos=1; int min; int result=0; //最小生成树的权值和 memset(visited, 0, sizeof(visited)); for (int i=1; i<=n; i++) { low[i]=map[pos][i]; //初始化low[i]值 } visited[1]=1; for (int i=1; i<n; i++) //进行n-1次选择 { min=Max; for (int j=1; j<=n; j++) //找未加入集合顶点的最小边 { if(!visited[j] && min>low[j]) { min=low[j]; pos=j; } } result+=min; visited[pos]=1; for (int j=1; j<=n; j++) //更新low的值 { if(!visited[j] && low[j]>map[pos][j]) //原来的low值比当前跟新路径后的值要大 { low[j]=map[pos][j]; } } } return result; } int main() { int v,ans,n; while(scanf("%d",&n)!=EOF) { memset(map,Max,sizeof(map)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&v); map[i][j]=map[j][i]=v; } ans=prim(n); printf("%d\n",ans); } return 0; }
相关文章推荐
- 最小生成树的prim算法贪心正确性的证明
- 贪心法--最小生成树的Prim算法和Kruskal算法
- POJ1258--贪心&最小生成树的prim算法
- 最小生成树的prim算法贪心正确性的证明
- hdu 1875 最小生成树(prim算法)…
- hihoCoder - hiho一下 第二十六周 - A - 最小生成树一·Prim算法
- Prim算法构造最小生成树
- hdu 1879 最小生成树 prim算法实现
- 最小生成树--prim算法
- 最小生成树-Prim算法和Kruskal算法
- POJ1233 Agri-Net(最小生成树,prim算法)
- 最小生成树Prim算法学习
- Prim算法 ----最小生成树
- c++ 最小生成树之prim算法
- 最小生成树,MST,Prim算法,poj2485
- 求图的最小生成树(prim算法
- 最小生成树的Prim算法
- 最小生成树-Prim算法
- 数据结构:最小生成树--Prim算法
- 用于最小生成树的Prim算法实现