最小生成树定义:

一个无向图,任意两个顶点都是联通的,并且是一个树,这棵树就叫生成树。如果边上有权值,使边的权值和最小的生成树叫做最小生成树。
求解最小生成树有两个算法,克鲁斯卡尔(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;
}

最小生成树————普利姆和克鲁斯卡尔相关推荐

  1. 最小生成树-普利姆和克鲁斯卡尔算法

    目录 最小生成树 普利姆算法 算法介绍 代码 克鲁斯卡尔算法 算法介绍 步骤解析 回路 代码实现 最小生成树主要是用于解决修路问题等类似问题,要将所有顶点连通,并且权值之和最小. 最小生成树 给定一个 ...

  2. [算法]最小生成树-普利姆算法

    2019独角兽企业重金招聘Python工程师标准>>> 目前正在看<大话数据结构>,其中介绍了普利姆算法,自己对算法理解能力太差,能够手写求出最小生成树,但是写出算法代码 ...

  3. 【算法基础12】最小生成树的两种解法(普里姆、克鲁斯卡尔)

    一.稠密图:朴素版prim算法 主要思想:每次从树外的结点中找到一个距离树最近的点加入树,将这段路径长度计入最小生成树的路径长度中,然后依据新的树更新树外结点距离树的距离,再次找到最近点加入,直到所有 ...

  4. 最小生成树算法普利姆算法和克鲁斯卡尔算法实现

    最小生成树算法: 普里姆算法:顶点集合N,辅助顶点集合S,初始化中,将出发点vi加入S,并从N中删除 1.从顶点集合N中找到一条到集合S最近的边(vi,vj),存储该边,并将vj从N移到S中 2.重复 ...

  5. 普利姆算法和克鲁斯卡尔算法求解最小生成树

    Q:最小生成树有什么用? A:譬如我要去五个城市旅游,每两个城市之间可能有路也可能没有,路的距离可能一样也可能不一样,随机从一个城市出发,我想要把每个城市走一遍,怎么样走过的路距离最短,比如我想从上海 ...

  6. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

  7. 普利姆算法和克鲁斯卡尔算法解决最小生成树问题

    什么是最小生成树? 最小生成树(Minimum Cost Spanning Tree),简称MST. 最小生成树要求图是连通图.连通图指图中任意两个顶点都有路径相通,通常指无向图.理论上如果图是有向. ...

  8. Java普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal)

    1.Java普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal) 普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal)求**最小生成树(极小连通子图)**的算法 1.1普利姆算法(Prim) ...

  9. 普利姆(Prim)算法与克鲁斯卡尔(Kruskal)算法

    普利姆算法就是求出最小生成树的算法之一 最小生成树:给定一个大权的无向连接图如何选取一颗生成树,使树上的所有边上权的总和为最小,这就叫做最小生成树 例子: 用Prim算法从p城出发 求出生成树: 结果 ...

最新文章

  1. Runtime Errors:CALL_FUNCTION_REMOTE_ERROR/CALL_FUNCTION_NOT_REMOTE
  2. 论文阅读:Multi-scale orderless pooling of deep convolutional activation features
  3. 突发!贾跃亭或将申请个人破产重组
  4. linux系统增加内存无法启动,linux – 增加虚拟内存而不增加VmSize
  5. jQuery中调用方法,动态拼接传字符串参数格式
  6. 行尸走肉第八季/全集The Walking Dead迅雷下载
  7. 微信小程序模板全行整理合集
  8. H83601D直插DIP千兆双口网络接口隔离滤波脉冲变压器
  9. 反编译DLL并修改后再生成DLL
  10. 英语句子组织的5个步骤
  11. 计算机英语作业答案,大工20春《专业英语(计算机英语)》在线作业1题目【标准答案】...
  12. python函数调用键盘热键_Python自定义快捷键,热键,HotKey
  13. Icarus iverilog中PLI使用范例
  14. UnRAR.dll解压rar文件
  15. 字节跳动全链路压测(Rhino)的实践
  16. C++编译错误提示 [Error] name lookup of 'i' changed for ISO 'for' scoping
  17. C#应用案例之打字母游戏
  18. Fone Keeper Mac版,帮你轻松恢复iOS数据
  19. java正则在线转换_java正则表达式(转)
  20. 干货分享:Google搜索如何限制在具体的一个州或城市

热门文章

  1. Graham-Scan算法计算凸包的Python代码实现
  2. QT:QSS自定义QLineEdit实例
  3. python七夕表白代码(转载)
  4. spark中的转换算子和行动算子区别(transformations and actions)
  5. python假分数约分,数学中假分数怎么约分
  6. TypeScript实战-05-TS接口之对象类型接口
  7. EasyDarwin开源流媒体服务器
  8. 局部边缘保持滤波(LEP)高动态范围图像HDR压缩 python实现
  9. CSS文本超过两行用省略号代替(兼容所有浏览器)
  10. MFC检测程序未响应