最小生成树算法
2015-07-24 16:50
197 查看
定义
由带权的连通图生成的数的各边加起来称为生成树的权,把权值最小的生成树称为最小生成树(Minimum Spanning Tree),简称为MST分析
\qquad构造最小生成树的方法就是利用MST性质,一条一条地选择可以加入的边。下面介绍两种用于构造最小生成树的算法,其中第一种算法称为Prim算法,第二种算法称为Kruskal算法。\qquadPrim算法中,每次循环选择一个顶点(和一条边)加入到最小生成树中,直到所有顶点全部在最小生成树中为止。与Prim算法不同,Kruskal算法在一开始就把所有顶点都放到最小生成树中,每次循环只根据MST性质,选择一条适当的边加到最小生成树,直到没有合适的边为止。
Prim算法
#define INF 0x3f3f3f3f #define MAX 10010 int cost[MAX][MAX]; //保存图 int prim(int n){ //点为 0~n int ans = 0; //权值 int vis[MAX]; //访问标记 int lowc[MAX]; //权最小的边 memset(vis,0,sizeof(vis)); vis[0] = 1; for(int i=1; i<n; i++)lowc[i] = cost[0][i]; for(int i=1; i<n; i++){ int minc = INF; int p = -1; for(int j=0; j<n; j++) if(!vis[j] && minc>lowc[j]){ minc = lowc[j]; p = j; } if(minc == INF)return -1; //图不连通 ans += minc; vis[p] = 1; for(int j=0; j<n; j++) if(!vis[j] && lowc[j]>cost[p][j]) lowc[j] = cost[p][j]; } for(int i=0; i<n; i++) cout<<lowc[i]<<" "; cout<<endl; return ans; }
Kruskal算法
#define MAXN 10010 //最大点数 #define MAXM 1000010 //最大边数 int f[MAXM]; //并查集数组 struct Edge{ int u; //边起点 int v; //边终点 int w; //边的权值 }edge[MAXN]; bool cmp(Edge x, Edge y){ return x.w < y.w; } int find(int x){ if(f[x] == -1) return x; return f[x] = find(f[x]); } int Kruskal(int n,int m){ //点数 0~n-1 ,边数 m memset(f,-1,sizeof(f)); sort(edge,edge+m,cmp); int ans = 0; int cnt = 0; //记录加入的边数 for(int i=0; i<m; i++){ int u = edge[i].u; int v = edge[i].v; int w = edge[i].w; int r1 = find(u); int r2 = find(v); if(r1 != r2){ f[r1] = r2; ans += w; cnt++; } if(cnt == n-1) break; } if(cnt != n-1) return -1; //不连通 return ans; }
相关文章推荐
- http\r\n
- Ubuntu系统下的Hadoop集群(1)_Hadoop安装教程_单机/伪分布式配置
- Spring boot 学习知识点
- jsoncpp-0.5,支持uint64
- angularjs图片上传后不刷新的解决办法
- Shell根据年月日创建文件夹
- java中Cookie的使用
- Java构造和解析Json数据的两种方法详解
- cocos2d-x中文乱码问题解决
- 008华为机试分解字符串,M,N问题
- open函数后面参数'a','w','r'的区别
- 虚函数的工作原理
- 机器学习(4)——logistic regression
- localhost与127.0.0.1之间的区别
- could not perform addBatch
- mysql主从配置
- windows上Apache+tomcat实现主备机服务器
- HOW TO INSTALL PHANTOMJS ON A CENTOS SERVER
- Android常用的设计模式
- 多线程问题