最小生成树、最小瓶颈路
文章平均质量分 83
qte_acm
这个作者很懒,什么都没留下…
展开
-
poj 2031 简单的kruskal算法运用
这题需要注意的一点:这这些空间单元中 , 可能有些单元是重叠或是接触的 , 那么它们之间的距离就是0调用并查集时尽量优化代码:int n;double xy[110][4];int p[110] ;int rank[110];struct node{ int u ,v; doublew;}edge[10010];bool cmp(node x ,原创 2013-12-14 20:05:00 · 732 阅读 · 0 评论 -
poj2728最优比率生成树
首先这是要解决什么问题:一个带权完全图,每条边都有自己的花费值cost[i]和收益值benifit[i],如果用x[i]来代表一条边取或不取,那么求一个生成树。要求:r=(∑cost[i]*x[i]) / (∑benifit[i]*x[i] )最小。经典题目:POJ2728 - Desert King如何来求解:这里用到了0-1分数规划思想,对于上式可以变形为z(r)=∑cost[i]*x原创 2013-12-14 20:04:06 · 676 阅读 · 0 评论 -
最小生成树的一些性质和理解
1) 定义在一棵树里添加一条边,并在产生的圈里删除一条边叫做一次操作。(也就是说换掉一条边并且保证结果是树),则树A和B是无向图的两个生成树,则A可以通过若干次操作变成B。 证:把树看作边的集合,如果B中有一条A没有的边,则把这条边加到A上,A产生一个圈中至少有一条是B中没有的边,把这条边删掉,则A仍然是生成树,A,B集合相同的边多了一条,重复这个过程直到A B包含的边相同。原创 2013-12-14 20:03:16 · 8858 阅读 · 2 评论 -
poj 1789 最小生成树
题目大意:这个题目真他妈的是在考英语 。 割!!!意思是说,给出n个卡车的代码 , 而卡车a衍生卡车b代价为a和b代码不相同字母的个数 , 问,衍生了这么多的卡车 ,最小的代价是什么。(每辆卡车可以有任何一个卡车衍生而来 , 除本身外!) 所以,明显是在求最下生成树 , 由题意可知 ,建成的图为稠密图 , 所以用prim算法 。但要注意优化 , 不然超时。割 代码1、 超时了:#原创 2013-12-14 20:02:05 · 619 阅读 · 0 评论 -
MST中求任意两点条路径上的最长边…
1、MST任意两点路径上的最长边 这其实是在求次小生成树 , 因为我们可以知道 ,次小生成树和最小生成树之间只有一条边不一样 , 因此我们只需要枚举不在最小生成树中边 ,同时我也要求出该两点在最小生成树中之间的路径中的最长边的值。解法:我们用kruskal算法来求出最小生成树 , 对于kruskal算法 , 当我们要加入一条边时 , 实际上是在把两颗“树”合并, 那么从这两颗树上各原创 2013-12-14 20:06:23 · 2348 阅读 · 0 评论 -
uva 11865 stream my contest
这明显是一个求最小树形图的题 , 只不过这个题多了一个限制条件 。因此问题可转化为:把每条网线的话费做为每条边的权值 , 而对于最小宽带最大化 , 可以用二分法来做 。让确定宽带是多少时 , 就禁用比这个宽带小的网线 , 然后再用朱刘算法来求最小花费 , 如果这个花费大于题目给出的限制那么就失败 ,否则成功 。代码:#include#include#include#includ原创 2013-12-14 20:03:33 · 596 阅读 · 0 评论 -
有向图最小生成树——最小树形图(朱…
对于有向图的最小生成树 , 也叫做最小树形图 。 最小树形图的第一个算法是1965年朱永津和刘振宏提出的复杂度为O(VE)的算法。值得我们骄傲啊 。下面来分享这个算法 。1、求最小树形图之前一定要确定根 , 确定根之后再去验证是否存在树形图(这个很简单 , 就是从根节点能不能到其他点) 。2、如果存在树形图 , 然后再消掉自环 , 因为对于最小树形图 , 是肯定不能存在自环的(还有原因后原创 2013-12-14 20:03:25 · 9598 阅读 · 1 评论 -
每个点与点之间的瓶颈路
瓶颈路:最小生成树中边权最大那条边 。这个题目最普通的算法就是bfs和dfs , 但这旺旺都会超时 。下面有两种各是时间效率或空间效率高的算法。1、 时间高效率 当你要查询每对点与点之间的瓶颈路时 , 最好的方法时 , 先把所有点之间的求出来 , 然后存放到一个数组中 ,但这要求节点数不能太大(如:n = 50000 , 就不可能全部存下来 , 只能一个一个求) 。 我原创 2013-12-14 20:03:23 · 1655 阅读 · 0 评论 -
LA 5713 Qin&nbsp…
这是一个要建图和枚举的题目 ,想到枚举 , 我们这个题目只能枚举人口 A, 和 最后所得的最短路B , 进一步想 , 最短路B要枚举是不可能的 ,所以只能枚举人口A , 也就是枚举每一条边(假设这条边的边权为0) 。想到这里题目就基本上做出来了,有几个注意点:1、求最短路时用kruskal算法 , 不然会超时 , (一般情况下都是kruskal这个算法更快 ,因为它可以通过优先队列来原创 2013-12-14 20:03:21 · 545 阅读 · 0 评论 -
poj 2485 简单的最小生…
题目意思:要你求一个生成树 , 使这个生成树(不一定是最小生成树)中边权最大值最小 , 并输出该值。这个题目我一开始用的是kruskal算法 , 先对边进行排序 , 但后面犯了一个错误 , 当判断是否存在生成树时 ,我判断的是前面的边是否包含所有顶点(没有发现 , 有可能这些点不是在通一个连通图中) , 应该用并查集 。其实最大值最小就是最小生成树中的最大值 , 这个性质的证明可以用kr原创 2013-12-14 20:03:13 · 552 阅读 · 0 评论 -
poj 3522 MST性质的运用
题意:求最一个生成树 , 使得这个生成树中最大权值边减去最小权值边的值最小。解法:我们可以枚举所有生成树 , 但是这样时间消耗太大 。 因此 , 我们可以考虑到 , 在这些生成树中有一些生成树是没有必要枚举的。 我们要求的这个值只跟生成树中的最小权值和最大权值有关联 , 因此我们只需要枚举生成树中的最小值和最大值 ,又对于一个确定最小值的生成树中 , 最大权值的最小值 , 就是确定最小值得原创 2013-12-14 20:06:21 · 735 阅读 · 0 评论 -
poj 1251
这是一个简单的最小生成树题目 , 就是字符串输入太麻烦注意:每个之间的空格不一定是一个,可能是多个 。 所以不能用gets , 用scanf+%c+%d也不行 ,必须用scanf+%s+%d代码:#include#include#include#includeusing namespace std;const int MAXN = 100;int u[MAXN] ,原创 2013-12-14 20:04:01 · 558 阅读 · 0 评论 -
uva 11865 stream my contest
这明显是一个求最小树形图的题 , 只不过这个题多了一个限制条件 。因此问题可转化为:把每条网线的话费做为每条边的权值 , 而对于最小宽带最大化 , 可以用二分法来做 。让确定宽带是多少时 , 就禁用比这个宽带小的网线 , 然后再用朱刘算法来求最小花费 , 如果这个花费大于题目给出的限制那么就失败 ,否则成功 。代码:#include#include#include#includ原创 2013-12-14 20:03:30 · 568 阅读 · 0 评论 -
uva 11354 Bond
这题要求最小瓶颈路 , 由于数据太多 , 所以用一般的bfs或dfs肯定会超时 。在这个题目上就应该充分的考虑到 , 最小生成树是一棵树 , 所有就可以通过树的性质来解决这个问题 。1、首先把最小生成树 , 建成一颗有根树 , 最好用bfs因为dfs可能会爆栈。2、在建树的时候 ,记录每个点的深度(根节点的深度为0)、每个节点的父亲节点(根节点的为-1)、每个节点和父亲节点的距离(根节点原创 2013-12-14 20:03:18 · 617 阅读 · 0 评论 -
poj 1079 判断最…
题意:有n个点 、 给出m条边 , 判断这个图的次小生成树是否唯一?判断一个次小生成树是否唯一: 首先由kruskal算法求出最小生成树 , 并且记录生成树上 , 任意两点路径上的最大边权 ,然后再把不属于最小生成树的边 , 一条一条加入生成树、再删除该条路径权值最大的边 ,然后再判断新得到的生成树的权值是否和最小生成树的权值一样、代码:在代码中 , 我们用数组模拟了链表 , 这个链原创 2013-12-14 20:05:06 · 723 阅读 · 0 评论 -
poj 1258 简单的prim算法运用
题意:村长有一个农田接了高速网络 , 他想把网络通过接到其他农田 , 下面给出n个农田 , 每个农田到其他农田的距离 ,要求所需网线的最短距离 ?很明显这是一个简单的最小生成树问题:代码:#include#include#includeusing namespace std;#define maxn 1000000int grap[110][110];int n;原创 2013-12-14 20:05:03 · 679 阅读 · 0 评论 -
uva 1265 (LA 4848)
题意:给出一个带权无向图 , 假设存在这样一个子图:子图中至少两个点 , 并且连通 , 子图中的最小边权 ,要比边界边的最大值大(边界边是指 , 一个点在子图中 , 另一个点不在子图中) , 问 ,所有这样子图的顶点数总和是多少?解法:kruskal的思想,先将边权大的连接,然后判断是否满足 , 依次连接即可!我们先考虑用kruskal算法求最大生成树的过程 , 假如我们要加入一条新原创 2013-12-14 20:06:25 · 1266 阅读 · 0 评论