这一题,就是简单的最小生成树的应用。开始,没有想到用最小生成树做,想到的是贪心,当知道了用最小生成树做的时候,还犯了一个很严重的错误,就是时间复杂度的估计错了,导致开始不敢写,在想其他的办法。当作一次教训吧。
下面是AC的代码,有详细的注释,用的是并查集来判环,时间复杂度为nlogn,主要时间在排序上。
#include
#include
#include
#include
using...
分类:
其他好文 时间:
2015-05-02 12:33:32
阅读次数:
119
最小生成树kruskal算法。
首先必须形成一棵最小生成树,然后找出最长的路。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,m,a,b,c,par[1005],rankk[1005], max_road;
struct edge {
int u,v,c...
分类:
其他好文 时间:
2015-05-01 12:08:49
阅读次数:
147
最大生成树,只需要变一下改变值的部分就可以了。
尝试了一下运用并查集的kruskal算法,与prim相比各有利弊吧,还要根据数据特点适当选取。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n,m,a,b,c,par[1005],rankk[1005];
struc...
分类:
其他好文 时间:
2015-05-01 10:44:48
阅读次数:
130
#include
#include
struct edge{
int u;
int v;
int w;//为了方便排序这里穿件一个结构体来存储边的关系
}e[10];
int n,m;
int f[10]={0},sum=0,count=0;//并查集需要得到的一些变量
//f数组大小根据实际情况来设置,要比n的最大值大1
//排序
int cmp(const void *a,const voi...
分类:
其他好文 时间:
2015-04-28 16:11:27
阅读次数:
124
这题,典型的最小生成树问题,可以用Kruskal算法来实现,配合着并查集来高效求解。
先将各边按权值进行从小到大排列。遍历一个各边便可求解,时间复杂度为O(|E|log|V|),其中E为边的个数,V为顶点数。
下面是AC代码,代码中有注释:
#include
#include
#include
using namespace std;
class data ...
分类:
其他好文 时间:
2015-04-27 15:16:20
阅读次数:
127
越来越明白了一个道理:你写不出代码的原因只有一个,那就是你没有彻底理解这个算法的思想!!
以前写过最小生成树,但是,水了几道题后,过了一段时间,就会忘却,一点也写不出来了。也许原因只有一个,那就是我没有彻底理解这两种算法。
主题:
其实,求最小生成树有两个要点,一个是权值最小,还有一个就是这个图必须是树。而Prime和Kruskal的不同之处在于两者选择的变量不同,Prime选择的是始终保持...
分类:
编程语言 时间:
2015-04-26 09:23:26
阅读次数:
186
【题目链接】:click here~~
【题目大意】:已知某几条道路已经修完,求全部道路要通路的最小花费
【解题思路】:基础的Kruskal算法了,按照边的权值从小到大排序一遍,符合条件加入到生成树中
代码:
/*
Author:HRW
kruskal+并查集
*/
#include
using namespace std;
const int max_v=105;
const int...
分类:
编程语言 时间:
2015-04-25 10:45:48
阅读次数:
208
Kruskal算法:
1:按照边的权值的顺序从小到大查看一遍,如果不产生圈(重边也算),就把当前这条边加入到生成树中,基本算法证明和prim一样
2:如何判断是否产生负圈,假设现在要把连接顶点u和顶点v的边e加入到生成树中,如果加入之前u和v不在同一个联通分量里,那么加入e也不会产生负圈,反之,如果u和v在同一个连通分量里,那么一定会产生圈,可以使用并查集高效的判断是否属于同一个连通分量
P...
分类:
编程语言 时间:
2015-04-24 22:48:54
阅读次数:
187
题目大意:
给你图的N个点和M条双向边。告诉你每条边的权值。权值为1表示该边是白边,权值为0表示该
边为黑边。问:能否找到一棵生成树,使生成树白边的个数恰好为fibonacci数。如果能构成这样
的fibonacci树,输出Yes,否则输出No。
思路:
先将fibonacci数列打表。然后根据题意构图。然后根据边的权值大小排序,用Kruskal先求一遍
最小生成树,再求一遍最大生成树。如果最小生成树和最大生成树之间存在fibonacci树,则说明
能够成fibonacci树。这是因为如果...
分类:
其他好文 时间:
2015-04-24 21:11:45
阅读次数:
202
题目链接:BZOJ - 3995题目分析这道题..是我悲伤的回忆..线段树维护连通性,与 BZOJ-1018 类似,然而我省选之前并没有做过 1018,即使它在 ProblemSet 的第一页。更悲伤的是,这道题有 40 分的暴力分,写个 Kruskal 就可以得到,然而我写了个更快的 DP 。这本...
分类:
其他好文 时间:
2015-04-24 18:37:28
阅读次数:
161