最小生成树

图的应用——最小生成树

*爱你&永不变心* 提交于 2020-01-14 18:04:02
最小生成树 求最小生成树 构造最小生成树的准则 贪心算法(Greedy Algorithm) Prim(普里姆)算法 算法思想 —— 归并顶点 算法设计 KrusKal(克鲁斯卡尔)算法 算法思想 —— 归并边 算法设计 Prim和KrusKal比较 最小生成树 生成树(极小连通子图):含有图中全部n个顶点,但只有n-1条边。并且n-1条边不能构成回路。 生成森林:非连通图每个连通分量的生成树一起组成非连通图的 生成森林 。 求最小生成树 使用不同的遍历图的方法,可以得到不同的生成树 从不同的顶点出发,也可能得到不同的生成树。 按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点、n-1 条边。 在网的多个生成树中,寻找一个各边 权值之和最小的生成树 构造最小生成树的准则 必须只使用该 网中的边 来构造最小生成树; 必须使用且仅使用 n-1 条边来联结网络中的 n 个顶点 不能使用产生 回路 的边 贪心算法(Greedy Algorithm) 算法原理:以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪心法不要回溯。 算法优点:因为省去了为寻找解而穷尽所有可能所必须耗费的大量时间,因此算法效率高。 贪婪算法的精神就是“ 只顾如何获得眼前最大的利益 ”,有时不一定是最优解。 Prim(普里姆)算法 算法思想 —— 归并顶点 在图中任取一个 顶点K作为开始点 。

POJ1287最小生成树

只愿长相守 提交于 2020-01-10 18:50:18
You are assigned to design network connections between certain points in a wide area. You are given a set of points in the area, and a set of possible routes for the cables that may connect pairs of points. For each possible route between two points, you are given the length of the cable that is needed to connect the points over that route. Note that there may exist many possible routes between two given points. It is assumed that the given possible routes connect (directly or indirectly) each two points in the area. Your task is to design the network for the area, so that there is a

算法导论——最小生成树:Kruskal算法(利用了并查集)

醉酒当歌 提交于 2020-01-07 15:11:19
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> package org.loda.graph; import org.loda.structure.MinQ; import org.loda.structure.Queue; import org.loda.util.In; /** * * @ClassName: KruskalMST * @Description:Kruskal最小生成树算法 * @author minjun * @date 2015年5月25日 下午10:50:01 * */ public class KruskalMST { private Queue<Edge> mst; private double weight; public KruskalMST(WeightGraph g){ int v=g.v(); mst=new Queue<Edge>(); MinQ<Edge> q=new MinQ<Edge>(); UF uf=new UF(v); //将所有边添加到优先队列中 for(Edge edge:g.edges()){ q.offer(edge); } while(!q.isEmpty()){ Edge edge=q.poll(); int a=edge.oneSide(); int b=edge.otherSide(a);

【算法学习】最小生成树

只愿长相守 提交于 2020-01-02 19:24:16
最小生成树 最小生成树的算法包括Prim算法和Kruskal算法。 在用Kruscal算法的时候会用到并查集。 完整代码可直接翻到最后~ 首先咱们先介绍比较容易理解也是最先会想到的一个算法,Prim算法。 Prim Prim算法的时间复杂度为O(n^2)。 Prim算法的思想就是从图中任意一点选择为始点,然后开始搜索可以从这个点到达其他点的最短距离。其实这个思想和Dijstra算法很相似。 不同之处在于,Dijstra算法计算的是点到点最短距离,Prim算法是把所有点连通起来权值最小。 实质上也就是,Dijstra算法在把某个点加入到集合中时,它的算法仅仅只是把这个点当做一个跳板,内部点与点之间还是存在距离(得到了某个人却没有得到它的心)。而Prim算法则是把这个点合在了一起,也就是在加入某个点之后,就可以把这些点看成一个点,集合内部没有距离(得到某个人并且得到了它的心)。 看例子(从0开始): 用Dijstra算法 首先0,然后0->1, 最后0->2。 用Prim算法 首先0,然后0->1,最后1->2。 所以这两个算法的区别就是在于0->1这个距离在后续中考虑存在与否。更一般的就是被添加到集合中的点与点之间的距离是否还存在。 好的,请看算法核心代码 void Primnew () { int V[N]; //V[] 记录节点的前驱 int dis[N];/

博客作业06--图

纵然是瞬间 提交于 2019-12-30 00:56:32
1.学习总结 1.1图的思维导图 1.2 图结构学习体会 深度优先遍历与广度优先遍历 不同点:广度优先搜索,适用于所有情况下的搜索,但是深度优先搜索不一定能适用于所有情况下的搜索。因为由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的 广度优先搜索适用范围:在未知树深度情况下,用这种算法很保险和安全。在树体系相对小不庞大的时候,广度优先也会更好些。 深度优先搜索适用范围:刚才说了深度优先搜索又自己的缺陷,但是并不代表深度优先搜索没有自己的价值。在树深度已知情况下,并且树体系相当庞大时,深度优先搜索往往会比广度优先搜索优秀,因为比如8*8的马踏棋盘中,如果用广度搜索,必须要记录所有节点的信息,这个存储量一般电脑是达不到的。然而如果用深度优先搜索的时候却能在一个棋盘被判定出来后释放之前的节点内存。 Prim和Kruscal算法 Prim算法的实现过程:首先以一个结点作为最小生成树的初始结点,然后以迭代的方式找出最小生成树中各结点权重最小的边,并加到最小生成树中。(加入之后如果产生回路了就要跳过这条边,选择下一个结点。)当所有的结点都加入到最小生成树中后,就找出了这个连通图的最小生成树。 Kruskal算法的实现过程:Kruskal算法在找最小生成树结点之前,需要对权重从小到大进行排序

图的应用(最小生成树)

萝らか妹 提交于 2019-12-27 07:36:03
最小生成树 背景 :假设要在n个城市之间建立通信网络,则连通n个城市只需要n-1条线路。这时。自然会考虑一个问题,如何在最节省经费的条件下建造这个通信网。在每两个城市之间都可以建立一条线路,相应的都要付出一定的经济代价。n个城市之间,最多可以设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的消耗经费最小呢? 可以用连通网表示n个城市,以及n个城市之中可能设置的线路,其中网的顶点表示城市,边表示城市之间的线路,赋予边的权值表示相应的代价。对于n各顶点连通网可以建立许多不同的生成树,每一刻生成树都可以是一个通信网。最好的通信网应该是代价之和最小的生成树。在一个连通网的所有生成树中,各边的代价之和最小的那颗树成为该连通网的 最小代价生成树 ,简称为 最小生成树 。 MST性质 :建设N=(V,E)是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小生权值(代价)的边,其中u∈U,v∈V-U,则比存在一颗包含边(u,v)的最小生成树。 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法是两个利用MST性质构造最小生成树的算法。 普里姆算法: (1)普里姆算法的构造过程: 假设N=(V,E)是连通网,TE是N上最小生成树中边的集合。 U={u0}(u0∈V),TE={}。 在所有的u∈U,v∈V-U的边(u,v)∈E中找一条权值最小的边(u0

MST最小生成树及克鲁斯卡尔(Kruskal)算法

久未见 提交于 2019-12-25 00:42:05
最小生成树MST,英文名如何拼写已忘,应该是min spaning tree吧。假设一个无向连通图有n个节点,那么它的生成树就是包括这n个节点的无环连通图,无环即形成树。最小生成树是对边上权重的考虑,最小生成树即树的所有边上权重值之和最小,最小指权重最小,即 在含有 n 个顶点的连通网中选择 n-1 条边,构成一棵极小连通子图,并使该连通子图中 n-1 条边上权值之和达到最小 。专业一点的解释: 在一给定的 无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此 边 的权重,若存在 T 为 E 的 子集 (即)且为无循环图,使得 w(T) 最小,则此 T 为 G 的 最小生成树 。 最小生成树算法: 一、 克鲁斯卡尔(Kruskal)算法 克鲁斯尔卡算法的时间复杂度为O(ElogE),E为无向图中边的数目。适用于求边稀疏的网格的最小生成树。 克鲁斯卡尔算法的基本思想为:为使生成树上总的权值之和达到最小,则应使每一条边上的权值尽可能地小,自然应从权值最小的边选起,直至选出 n-1 条互不构成回路的权值最小边为止。具体作法如下:首先构造一个只含 n 个顶点的森林,即初始无向连通图G=(V,E), 首先要对图中的各个边按照权值大小进行排序,这也体现了贪心算法的思想 ,资源排序,从而对局部最优的资源进行选择

最小生成树模板

倖福魔咒の 提交于 2019-12-24 03:02:27
prim算法 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int INF=999999999; double map[55][55],dist[55]; bool visit[55]; int n; void chu() { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) { if(i==j) map[i][j]=0; else map[i][j]=map[j][i]=INF; } } double prim() { double ans=0,minn; int node; memset(visit,false,sizeof(visit)); node=1; for(int i=1;i<=n;i++) if(i!=node) dist[i]=map[node][i]; //dist[1]=0; visit[1]=true; for(int i=1;i<n;i++) { minn=INF; for(int j=1;j<=n;j++) if(visit[j]==false&&dist[j]<minn) { minn=dist[j]; node=j; } ans+=minn; visit[node]=true; for(int

PAT顶级解题目录

青春壹個敷衍的年華 提交于 2019-12-24 02:03:42
持续更新中… 编号 题目 题解链接 标签 1001 Battle Over Cities - Hard Version C++ 最小生成树 1002 Business C++ 0/1背包 1003 Universal Travel Sites C++ 最大流 1004 To Buy or Not to Buy - Hard Version C++ DFS+剪枝 1005 Programming Pattern C++ 后缀数组/字符串哈希 1006 1007 1008 1009 1010 Lehmer Code C++ 树状数组 1011 Cut Rectangles C++ 思维题 1012 1013 1014 1015 1016 Uniqueness of MST C++ 最小生成树 1017 1018 Subnumbers C++ 思维题 1019 1020 Delete At Most Two Characters C++ 动态规划 1021 1022 1023 1024 1025 1026 1027 来源: CSDN 作者: Yuhan の Blog 链接: https://blog.csdn.net/qq_45228537/article/details/103671868

poj1251 最小生成树

你说的曾经没有我的故事 提交于 2019-12-23 17:59:07
Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to maintain. The Council of Elders must choose to stop maintaining some roads. The map above on the left shows all the roads in use now and the cost in aacms per month to maintain them. Of course there needs to be some way to get between all the villages on maintained roads, even if the route is not as short as before. The Chief Elder would like