kruskal 算法是利用边来进行的,而prim算法是利用点来进行的;
下面来介绍kruskal 算法:
废话少说贴代码:
#include<cstdio> #include<algorithm> using namespace std; struct edge { int from; int to; int cost; bool operator < (edge a,edge b) //operator 重载操作符 { //数据类型 operator (重载内容) (参数) return a.cost < b.cost; } }e[]; //并查集内容: //f[] 表示父亲节点; void ufs_iint(int n) //初始化集合; { for(int i = 0; i < n; i++) f[i] = i; } int Find(int x) // 查找函数: { if(f[x] == x) return x; else return Find(f[x]); } void merger(int x,int y) { int fx,fy; fx = Find(x); fy = Find(y); if(fx != fy) f[fy] = fx; } //并查集结束; int kruskal(int n,int point) //n代表边数, point代表点数; { int sum = 0,cnt = 0; sort(e,e + n); //上面结构体中已经进行了重载; ufs_iint(n); for(int i = 0; i < n; i++) { if(Find(e[i].from) != Find(e[i].to)) { merger(e[i].from,e[i].to); sum += e[i].cost; if(++cnt == point - 1) break; } return cnt == point - 1? sum : -1;//这里返回的是最小生成树的总边权; } }
它更适合求稀疏图;而prim算法更适合求稠密图;