最小生成树prim算法示例程序
2013-06-01 12:52
405 查看
n,m表示顶点数和边数。
lowcost[]存放顶点集合T'内各顶点到顶点集合T内各顶点权值最小的边的权。
nearvex[]记录顶点集合T'内各顶点距离顶点集合T内那个顶点最近。nearvex[i]为-1时,表示顶点i属于集合T.
lowcost[]存放顶点集合T'内各顶点到顶点集合T内各顶点权值最小的边的权。
nearvex[]记录顶点集合T'内各顶点距离顶点集合T内那个顶点最近。nearvex[i]为-1时,表示顶点i属于集合T.
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<string> #include<cmath> #include<map> using namespace std; const int INF=1000000; const int maxn=21; int n,m; int edge[maxn][maxn]; int lowcost[maxn]; int nearvex[maxn]; void prim(int u) { int sumw=0; for(int i=1;i<=n;i++)//初始化两个数组 { lowcost[i]=edge[u][i]; nearvex[i]=u; } nearvex[u]=-1; for(int i=1;i<n;i++)//把剩余n-1个节点扩展进来 { int min=INF; int v=-1; for(int j=1;j<=n;j++) if(nearvex[j]!=-1 && lowcost[j]<min) { v=j; min=lowcost[j]; } if(v!=-1)//没有找到权值最小的边 { printf("%d %d %d\n",nearvex[v],v,lowcost[v]); nearvex[v]=-1; sumw+=lowcost[v]; for(int j=1;j<=n;j++) if(nearvex[j]!=-1 && edge[v][j]<lowcost[j]) { lowcost[j]=edge[v][j]; nearvex[j]=v; } } } printf("weight of MST is %d\n",sumw); } int main() { int u,v,w; while(~scanf("%d%d",&n,&m)) { memset(edge,0,sizeof(edge)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); edge[u][v]=edge[v][u]=w; } for(int i=1;i<=n;i++)//对邻接矩阵中其他元素赋值 for(int j=1;j<=n;j++) { if(i!=j && edge[i][j]==0) edge[i][j]=INF; } prim(1);//从顶点1出发构造最小生成树 } return 0; }
相关文章推荐
- 最小生成树prim(普里姆)算法
- Prim最小生成树算法详解以及java实现源代码
- 求无向连通图的最小生成树算法——Prim与Kruska
- 最小生成树Prim算法理解
- 最小生成树——Prim(普利姆)算法
- 每日一省之————加权无向图的最小生成树算法(Prim/Kruskal算法)
- 算法:图解最小生成树之普里姆(Prim)算法
- 最小生成树 ,prim 和Kruskal 算法
- 最小生成树算法(1)-----------prim
- Prim 算法求最小生成树
- 关于图的常用算法——Dijkstra单源最短路径、Floyd多源最短路径、Prim和Kruskal最小生成树算法
- 无向图最小生成树Prim(普里姆)算法
- 15分钟掌握最小生成树普利姆(Prim)算法
- Prim最小生成树算法
- prim 算法 最小生成树
- 【算法——04】最小生成树——Prim和Kruskal算法
- 最小生成树PRIM()算法框架
- poj Agri-Net 最小生成树 prim 算法
- 最小生成树 prim 算法
- prim 算法笔记 最小生成树