Kruskal算法

思想:利用并查集,进行加边操作(每次选择最小权边,直至构成一个生成树)

步骤:

(1)排序:由小到大对边按权值进行排序

(2)当边的数量少于n-1时,重复以下操作:

选择最小权边,如果假如这条权边并不构成回路,那么添加它,否则不添加它

代码模板:

const int MAXN=110;//最大点数
const int MAXM=10000;//最大边数
int F[MAXN];//并查集使用
struct Edge
{int u,v,w;
}edge[MAXM];//存储边的信息,包括起点/终点/权值
int tol;//边数,加边前赋值为0
void addedge(int u,int v,int w)
{ edge[tol].u=u;edge[tol].v=v;edge[tol++].w=w;}
bool cmp(Edge a,Edge b)
{//排序函数,讲边按照权值从小到大排序 return a.w<b.w;
}
int find(int x)
{if(F[x]==-1)return x;elsereturn F[x]=find(F[x]);
}
int Kruskal(int n)//传入点数,返回最小生成树的权值,如果不连通返回-1
{memset(F,-1,sizeof(F));sort(edge,edge+tol,cmp);int cnt=0;//计算加入的边数int ans=0;for(int i=0;i<tol;i++){int u=edge[i].u;int v=edge[i].v;   int w=edge[i].w;   int t1=find(u);   int t2=find(v);   if(t1!=t2)   {ans+=w;F[t1]=t2;cnt++;}if(cnt==n-1)break;}if(cnt<n-1)return -1;//不连通 else return ans;
}  

Prim算法

思想:

从只含一个结点的子图开始构造生成树:

选择连接当前子图和子图外结点的最小权边,将对应结点和边加入子图,直至将所有结点加入子图。

步骤:

1.一个n-1次的循环更新距离数组,存储从起始点到各结点距离,并更改原点和标记数组

2.下面要加入n-1个点,对每次添加,都需要在剩下点中考虑(n个点,没有访问标记的)

3.当然如果某次添加,发现并没有点满足条件,直接跳出返回-1即可

4.每一次添加点后,都需要及时更新一下距离数组

模板:

const int INF=0x3f3f3f3f;
const int MAXN=110;
bool vis[MAXN];
int lowc[MAXN];
int Prim(int cost[][MAXN],int n)//点是0~n-1
{int ans=0;memset(vis,false,sizeof(vis));vis[0]=true;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]=true;for(int j=0; j<n; j++)if(!vis[j]&&lowc[j]>cost[p][j])lowc[j]=cost[p][j];}return ans;
}

注意事项

Prim算法时间复杂度是,与图中的边数无关,因此适用于求边稠密的图的最小生成树。

Kruskal算法的时间复杂度是(e是图中边的数目),适合求边稀疏的图的最小生成树。

最小生成树(Kruskal、Prim)相关推荐

  1. poj 1287 Networking 最小生成树 Kruskal Prim

    关于Kruskal和Prim在前面已经有详细的解释以及模板了 有关于需要注意的地方,以及在代码中注释出来. //Kruskal //用结构体保存起始点以及耗费,然后排序后,根据Kruskal #inc ...

  2. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  3. ReviewForJob——最小生成树(prim + kruskal)源码实现和分析

    [0]README 1)本文旨在给出 ReviewForJob--最小生成树(prim + kruskal)源码实现和分析, 还会对其用到的 技术 做介绍: 2)最小生成树是对无向图而言的:一个无向图 ...

  4. poj 3026 BorgMaze 最小生成树Kruskal、Prim(Prim VS报错待解决

    题意 以及 思路: 从S点有一伙人出发去消灭A点的敌人,在S点或者A点可以分裂成几个小队然后分别走,这样路径=总队路径+各个小队路径 问你怎样路径最短. 在一个y行 x列的迷宫中,有可行走的通路空格' ...

  5. 最小生成树 Kruskal算法 Prim算法

    文章目录 Kruskal算法 模板: Prim算法 模板: Kruskal算法 模板: https://blog.csdn.net/Rain722/article/details/65642992 K ...

  6. * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法

    文章目录 Kruskal算法 模板:https://blog.csdn.net/Rain722/article/details/65642992 Prim算法 模板: poj 1251 JungleR ...

  7. 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)

    图 最小生成树(Minimum Spanning Tree) Prim算法 切分定理 Prim算法 – 执行过程 Prim算法 – 代码实现 Kruskal算法 Kruskal算法 – 执行过程 Kr ...

  8. 最小生成树(Prim算法,Kruskal算法)

    最小生成树 假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路.这时,自然各 考虑这样一个问题,如何在最节省经费的前提下建立这个通信网. 在每两个城市之间都可设置一条线路,相应地都要 ...

  9. 求的带权图最小生成树的Prim算法和Kruskal算法

    求的带权图最小生成树的Prim算法和Kruskal算法 最小生成树的概念 最小生成树其实是最小权重生成树的简称. 一个连通图可能有多个生成树.当图中的边具有权值时,总会有一个生成树的边的权值之和小于或 ...

  10. `Computer-Algorithm` 最小生成树MST,Prim,Kruskal,次小生成树

    Contents 最小生成树 Algorithm Prim Code Kruskal Prim&KruskalPrim \& KruskalPrim&Kruskal算法的性质 ...

最新文章

  1. POJ 2987 Firing(最大权闭合图)
  2. 8G+256G固态笔记本,结合这款IDEA插件,写代码飞起!
  3. java开发环境及数据类型实验_实验项目1 Java开发环境与语言基础
  4. linux(十三)之磁盘分区、创建文件系统、挂载
  5. “最大数之父”葛立恒逝世,他是20世纪数学巨匠,也是一个杂技演员
  6. IFC最新标准 IFC4X3 RC2 和 IFC4X3 RC4 特点
  7. 7450清零_联想M7450F打印机加粉清零方法
  8. 移动端H5页面中加载的图片,在chrome和安卓手机中显示正常,在iphone和safari浏览器中个别图片显示问号的问题处理
  9. C语言打字练习小游戏
  10. mysql relay log 查看_Mysql-relay log
  11. 计算机学校的逻辑思维题,2013逻辑推理专项习题100道(附答案).docx
  12. win server 2008r2 相关设置
  13. html+css主页页眉实现
  14. 计算与推断思维 七、函数和表格
  15. 基于精英反向学习的逐维改进蜻蜓算法-附代码
  16. linux宝塔原理,linux宝塔是干嘛的
  17. ajax仿百度搜索效果,利用autocomplete.js实现仿百度搜索效果(ajax动态获取后端[C#]数据)...
  18. Java开发入门与实战!张孝祥java就业培训
  19. 鸡尾酒分类和制作材料中英文名
  20. 如何使用ocr文字识别软件

热门文章

  1. python Requests+正则表达式爬取猫眼电影top100
  2. 【行业应用案例】区块链+珠宝应用案例分析
  3. 阿里云CTO章文嵩:阿里云强大的数据和计算能力助力企业实现“弯道超车”
  4. laravel + xampp 除了根目录其他路由都是404的解决方法
  5. 【洛谷】P3957 [NOIP2017 普及组] 跳房子
  6. Python从入门到自闭(网络篇)
  7. 【计算机组织与体系结构】实验二:给定指令系统的处理器设计
  8. Windows彻底删除驱动程序
  9. usereduce reducer使用
  10. Jetson Xavier NX-EMMC重装系统