最小生成树

2013 Asia Chengdu Regional Contest

落花浮王杯 提交于 2020-01-30 04:09:48
I - Fibonacci Tree 题意 :给你一个无向图,N个点,M条边。边有两种类型,白边的边权为1,黑边的边权为0,问在无向图对应的生成树集合中,是否存在一个生成树,其白色边的数量为斐波拉契数? 思路 : 思维转化 如果存在此生成树,其生成树对应的权值和即为白色边的数量。 (因为黑色边对应的权值为0,白色边对应的权值为1) 观察 无向图对应的生成数集合里面的元素太多,枚举不完,我们就不妨考虑集合的两个特殊元素,一个最小生成树,一个最大生成树。 思考 最小生成树是如何变成最大生成树的?权值和变化有什么规律? 假设最小生成树为A,最大生成树为B,从B中找到一个边(在A中未出现过的),其边权为1或0,再把此边加入A中,我们会发现成一个环(由树的性质可知),这环上我们只需要拿走一条在B中未出现的边即可,边权为1或0。这样,往A中加边,去边,A这棵树的权值变化范围为+1,+0,+(-1),因为我们知道A是最小生成树,所以不需要一开始考虑会+(-1)(如果会出现这种情况,A就不是最小生成树)。 通过证明,可以发现,A的权值和到B的权值和的过程是只能通过+1,+0,+(-1)得到,所以我们可以知道,在无向图对应的生成树集合中,权值变化范围[A的权值和,B的权值和] 斐波拉契数可以先预处理出来,然后遍历区间**[A的权值和,B的权值和]**,看有无即可 <如果觉得讲得不错,点个赞支持一下

【图论】【最小生成树】最优布线问题

女生的网名这么多〃 提交于 2020-01-28 07:48:43
Description 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们之间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。 当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。 现在由你负责连接这些计算机,你的任务是使任意两台计算机都连通(不管是直接的或间接的)。 Input 输入文件wire.in,第一行为整数n(2<=n<=100),表示计算机的数目。此后的n行,每行n个整数。第x+1行y列的整数表示直接连接第x台计算机和第y台计算机的费用。 Output 输出文件wire.out,一个整数,表示最小的连接费用。 Sample Input 3 0 1 2 1 0 1 2 1 0 Sample Output 2(注:表示连接1和2,2和3,费用为2) 解题思路 很明显的最小生成树模板 kruskal算法 每次找最小的边,如果边连接的两个点不是一个集合的,那么就把这两个点连起来 不断找最短的边,并且这条边的两个点不在一个集合里 最后 顺便推一下 prim算法 #include < iostream > #include < cstdio > using namespace

(最小生成树)洛谷P2126 Mzc家中的男家丁

流过昼夜 提交于 2020-01-27 03:27:11
一、用Kruskal算法求最小生成树 基本算法紫书上写的比较详细了,自己理解的话,核心操作就是两步,第一步排序,第二步按照所排顺序连边,这里的排序方式是按照边权由小到大排,连边方式是选不会使得已有部分成环的边,也就是起点和终点不在一个连通分量的边。 二、代码及注释 这里的并查集部分之间搬了之前自己的并查集有关博客的代码。 # include <iostream> # include <cstdio> # include <cstring> # include <algorithm> # include <cmath> # include <vector> # include <map> using namespace std ; //const int maxn=5005; const int maxn = 400005 ; int pa [ maxn ] , r [ maxn ] ; int n , m , p ; int findy ( int x ) { return pa [ x ] == x ? x : pa [ x ] = findy ( pa [ x ] ) ; } bool pd ( int x , int y ) { return ( findy ( x ) == findy ( y ) ) ; } void uni ( int x , int y ) { int

最小生成树

我们两清 提交于 2020-01-26 18:58:42
目录 引言 定义 性质 算法 prim算法 基本思想 伪代码 邻接矩阵实现 邻接表实现 时间复杂度 kruskal算法 基本思想 伪代码 代码实现 时间复杂度 引言 定义 最小生成树(Minimum Spanning Tree or MST) 是在给定的 无向图 G(V,E)中求一棵树T,使得这棵树拥有图G中的 所有顶点 ,这棵树的所有边都来自于图G中的边,并且满足这棵树的 边权之和最小 。 性质 最小生成树是树,因此 其边数等于顶点数减1 ,且树内一定不会有环; 对给定的图G(V,E),其 最小生成树可以不唯一 ,但其 边权之和一定是唯一的 ; 由于最小生成树是在无向图上生成的,因此 其根节点可以是这棵树上的任意一个结点 。于是,如果题目中涉及最小生成树本身的输出,为了让最小生成树唯一,一般都会直接给出根节点,读者只需以给出的结点作为根结点来求解最小生成树即可。 算法 prim kruskal (以上两个算法都采用了贪心法的思想,只是贪心的策略不太一样) prim算法 基本思想 对图G(V,E)设置集合 S ,存放已被访问的顶点,然后每次从集合 V-S 中选择与集合 S 的最短距离最小的一个顶点(记为 u ),访问并加入集合 S 。 之后,令顶点 u 为中介点,优化所有从 u 能到达的顶点 v 与集合 S 之间的最短距离。这样的操作执行n次(n为顶点个数),直到集合 S

最小生成树

≯℡__Kan透↙ 提交于 2020-01-26 15:52:22
一、Prim Prim算法的思想是: 整个顶点集为 \(V\) ,初始选一个起点 \(s\) ,令集合 \(u=\{s\}, v=\{\}\) ; 在集合 \(u\) 与集合 \(V-u\) 中的点组成的边中,选一条权值最小的边 \(u_0v_0\) 加入MST,并且将 \(u_0\) 加入 \(u\) ; 重复直到MST有 \(n-1\) 条边或 \(n\) 个顶点为止。 int adjMax[MAXN][MAXN]; //邻接矩阵 int n; //顶点数目 int pos = 0, ans = 0; bool visited[MAXN] = {0}, cost[MAXN]; void Prim() { for (int i = 0; i < n; i++) { cost[i] = adjMax[0][i]; //集合u与集合V-u中的i点间距离最小值 visited[i] = false; } visited[0] = true; //已经在MST中 for (int i = 1; i < n; i++) //再找n-1个点 { //找到连接u和V-u的最小边并记录位置 int tmp = INT_MAX; for (int j = 0; j < n; j++) { if (visited[j] == false && cost[j] < tmp) { tmp = cost

【论文笔记】Segment-Tree based Cost Aggregation for Stereo Matching

自作多情 提交于 2020-01-26 12:25:40
——based on tree-based cost aggregation & segment, 下称"ST" NOTE 1. 和NLCA的算法异同? answer: 建树思路不一样 NLCA只是简单对每个像素点基于颜色相似度构建了一颗完整的树; STCA是在建树过程中,先根据图割的思路将颜色相似的块分别建了一颗子树,后面再将子树连接起来,效率会稍微比NLCA低一些 2. 和NLCA的实现异同? answer: NLCA整个代码从边权重排序到建立最小生成树再到构建有序树都是用数组实现,较为晦涩难懂,边权重排序部分尤其值得学习; STCA集成模块化更为完善,有定义明确的抽象数据类型来实现,主要值得借鉴的更多是算法角度将图割和NLCA融合来做优化的思路,另外,基于并查集构建最小生成树也值得借鉴 前言 立体匹配流程: 代价计算(cost compute) 代价聚合(cost aggregation) 视差计算(disparity computation) 视差优化(disparity refine) 本文目标是聚焦优化代价聚合(cost aggregation)模块的效果,主要分为: 局部法 :通过设计窗口形状、大小以及滤波权重在窗口内实现局部最优代价聚合(窗口外的像素可看做权重为0),优点是速度快,缺点是结果为局部最优,通常使用一些具有"edge-aware

HDU 4786 Fibonacci Tree 最小生成树

﹥>﹥吖頭↗ 提交于 2020-01-25 18:04:52
Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description  Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him to do some research on Spanning Tree. So Coach Pang decides to solve the following problem:   Consider a bidirectional graph G with N vertices and M edges. All edges are painted into either white or black. Can we find a Spanning Tree with some positive Fibonacci number of white edges? (Fibonacci number is defined as 1, 2, 3, 5, 8, ... ) Input   The first line of the input contains an integer T, the number of test cases.   For each test case,

5.3畅通工程-MST最小生成树

谁说胖子不能爱 提交于 2020-01-25 02:39:55
# include <stdio.h> # include <algorithm> struct edge { int a , b ; //下一节点的编号 int cost ; //该边的权重 bool operator < ( const edge & A ) const { //排序按cost从小到大排 return cost < A . cost ; } } edge [ 6000 ] ; int tree [ N ] ; int findroot ( int x ) { //递归查找祖先 if ( tree [ x ] == - 1 ) return x ; else return findroot ( tree [ x ] ) ; } int main ( ) { int n ; //点数 while ( scanf ( "%d" , & n ) != EOF && n != 0 ) { for ( int i = 1 ; i <= n * ( n - 1 ) / 2 ; i ++ ) //把各边权值输入 scanf ( "%d%d%d" , & edge [ i ] . a , & edge [ i ] . b , & edge [ i ] . cost ) ; sort ( edge , edge + n * ( n - 1 ) / 2 ) ; //对n*(n-1)

(最小生成树)POJ2349Arctic Network

杀马特。学长 韩版系。学妹 提交于 2020-01-23 20:27:58
POJ2349 Arctic Network 题意&思路: 给你p个点和s-1条免费边,问使两两点连通的最小的最长边。 求第p-s条最长边,kruskal。用%lf记得交c++。 代码: # include <iostream> # include <stdio.h> # include <stdlib.h> # include <algorithm> # include <string.h> # include <ctype.h> # include <queue> # include <set> # include <stack> # include <cmath> # include <map> # define pii pair<int,int> # define ll long long # define cl(x) memset(x,0,sizeof(x)) const int N = 1e6 + 10 ; const int mod = 1e7 + 9 ; const int maxn = 0x3f3f3f3f ; const int minn = 0xc0c0c0c0 ; const int inf = 99999999 ; using namespace std ; struct point { int x , y ; } a [ 600 ] ; struct

Java数据结构与算法精讲

被刻印的时光 ゝ 提交于 2020-01-23 03:19:40
课程简介 本系列视频教程为数据结构与算法基础,使用java语言描述,适合没有学过C/C++有一定Java基础的同学。没有Java基础的同学可以先行学习Java基础。 课程目录 ├─线性表 ├─栈和队列 ├─HashMap和LinkedHashMap ├─树 ├─二叉树 ├─图 ├─图的遍历与最小生成树 ├─图的最短路径与拓扑排序 ├─算法简介 ├─算法排序 ├─排序与归并 ├─递归与穷举 ├─贪心和分治 ├─动态规划和回溯 来源: CSDN 作者: di_pingxian 链接: https://blog.csdn.net/di_pingxian/article/details/103897423