最小生成树————普利姆和克鲁斯卡尔
最小生成树定义:
一个无向图,任意两个顶点都是联通的,并且是一个树,这棵树就叫生成树。如果边上有权值,使边的权值和最小的生成树叫做最小生成树。
求解最小生成树有两个算法,克鲁斯卡尔(Kruskal)算法和普利姆(Prim)算法。
注意:一个完整的最小生成树只需要顶点个数减一条边
先来讲克鲁斯卡尔:
把边的权值,从小到大查看一遍,如果不产生圈,就把当前边加入生成树中。
如何判断是否产生圈,假设要把连接顶点v和u的边e加入树种,如果u和v不在同一个连通分量里,那么加入e也不会产生圈。可用并查集判断两个顶点是否在一个连通分量里。复杂度O(E*log V) E是边的个数,V是顶点个数。
模板代码:
struct edge
{int u,v,cost;
};
bool cmp1(const edge &a,const edge &b)
{return a.cost<b.cost;
}
int par[MAX_N];
void init()
{for(int i=0;i<=n;i++)par[i]=i;
}
int find(int x)
{if(par[x]==x)return x;elsereturn par[x]=find(par[x]);
}
int kr()
{sort(a,a+m,cmp1);init();int cns=0,res=0;for(int i=0;i<m;i++){edge c=a[i];if(find(c.u)!=find(c.v)){par[find(c.u)]=find(c.v);res+=c.cost;if(maxx<c.cost){maxx=c.cost;k=i;}cns++;if(cns>=n-1)break;}}return res;
}
普利姆
代码模板:
int prime()
{for(int i=1;i<=n;i++){mincost[i]=INF;used[i]=false;}mincost[1]=0;int res=0;while(true){int v=-1;for(int i=1;i<=n;i++){if(!used[i]&&(v==-1||mincost[i]<mincost[v]))v=i;}if(v==-1) break;used[v]=true;res+=mincost[v];for(int i=1;i<=n;i++){mincost[i]=min(mincost[i],cost[v][i]);}}return res;
}
最小生成树————普利姆和克鲁斯卡尔相关推荐
- 最小生成树-普利姆和克鲁斯卡尔算法
目录 最小生成树 普利姆算法 算法介绍 代码 克鲁斯卡尔算法 算法介绍 步骤解析 回路 代码实现 最小生成树主要是用于解决修路问题等类似问题,要将所有顶点连通,并且权值之和最小. 最小生成树 给定一个 ...
- [算法]最小生成树-普利姆算法
2019独角兽企业重金招聘Python工程师标准>>> 目前正在看<大话数据结构>,其中介绍了普利姆算法,自己对算法理解能力太差,能够手写求出最小生成树,但是写出算法代码 ...
- 【算法基础12】最小生成树的两种解法(普里姆、克鲁斯卡尔)
一.稠密图:朴素版prim算法 主要思想:每次从树外的结点中找到一个距离树最近的点加入树,将这段路径长度计入最小生成树的路径长度中,然后依据新的树更新树外结点距离树的距离,再次找到最近点加入,直到所有 ...
- 最小生成树算法普利姆算法和克鲁斯卡尔算法实现
最小生成树算法: 普里姆算法:顶点集合N,辅助顶点集合S,初始化中,将出发点vi加入S,并从N中删除 1.从顶点集合N中找到一条到集合S最近的边(vi,vj),存储该边,并将vj从N移到S中 2.重复 ...
- 普利姆算法和克鲁斯卡尔算法求解最小生成树
Q:最小生成树有什么用? A:譬如我要去五个城市旅游,每两个城市之间可能有路也可能没有,路的距离可能一样也可能不一样,随机从一个城市出发,我想要把每个城市走一遍,怎么样走过的路距离最短,比如我想从上海 ...
- 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)
最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...
- 普利姆算法和克鲁斯卡尔算法解决最小生成树问题
什么是最小生成树? 最小生成树(Minimum Cost Spanning Tree),简称MST. 最小生成树要求图是连通图.连通图指图中任意两个顶点都有路径相通,通常指无向图.理论上如果图是有向. ...
- Java普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal)
1.Java普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal) 普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal)求**最小生成树(极小连通子图)**的算法 1.1普利姆算法(Prim) ...
- 普利姆(Prim)算法与克鲁斯卡尔(Kruskal)算法
普利姆算法就是求出最小生成树的算法之一 最小生成树:给定一个大权的无向连接图如何选取一颗生成树,使树上的所有边上权的总和为最小,这就叫做最小生成树 例子: 用Prim算法从p城出发 求出生成树: 结果 ...
最新文章
- Runtime Errors:CALL_FUNCTION_REMOTE_ERROR/CALL_FUNCTION_NOT_REMOTE
- 论文阅读:Multi-scale orderless pooling of deep convolutional activation features
- 突发!贾跃亭或将申请个人破产重组
- linux系统增加内存无法启动,linux – 增加虚拟内存而不增加VmSize
- jQuery中调用方法,动态拼接传字符串参数格式
- 行尸走肉第八季/全集The Walking Dead迅雷下载
- 微信小程序模板全行整理合集
- H83601D直插DIP千兆双口网络接口隔离滤波脉冲变压器
- 反编译DLL并修改后再生成DLL
- 英语句子组织的5个步骤
- 计算机英语作业答案,大工20春《专业英语(计算机英语)》在线作业1题目【标准答案】...
- python函数调用键盘热键_Python自定义快捷键,热键,HotKey
- Icarus iverilog中PLI使用范例
- UnRAR.dll解压rar文件
- 字节跳动全链路压测(Rhino)的实践
- C++编译错误提示 [Error] name lookup of 'i' changed for ISO 'for' scoping
- C#应用案例之打字母游戏
- Fone Keeper Mac版,帮你轻松恢复iOS数据
- java正则在线转换_java正则表达式(转)
- 干货分享:Google搜索如何限制在具体的一个州或城市
热门文章
- Graham-Scan算法计算凸包的Python代码实现
- QT:QSS自定义QLineEdit实例
- python七夕表白代码(转载)
- spark中的转换算子和行动算子区别(transformations and actions)
- python假分数约分,数学中假分数怎么约分
- TypeScript实战-05-TS接口之对象类型接口
- EasyDarwin开源流媒体服务器
- 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 python实现
- CSS文本超过两行用省略号代替(兼容所有浏览器)
- MFC检测程序未响应