一道结论题:如果最小生成树和最大生成树之间存在fib数,成立。不存在或者不连通则不成立。由于是01图,所以这个区间内的任何生成树都存在

证明:数学归纳?如果一棵树没有办法再用非树边0边替代1边了,那他就是最小生成树。如果一棵生成树大于最小生成树,那么他显然存在可以被替换的1边,否则会与最小矛盾。最大生成树存在(与最小生成树相等时显然结论成立),那么他一定可以有可以替换的边,所以所有区间内的生成树都存在。

吐槽:我一开始以为要依据fib的性质合并块。。研究好久。。冏。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define dbg(x) cerr << #x << " = " << x <<endl
#define dbg2(x,y) cerr<< #x <<" = "<< x <<" "<< #y <<" = "<< y <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=1e5+;
struct thxorz{int u,v,w;}e[N];
struct stothx{int nxt,to;}G[N<<];
int Head[N],tot;
inline void Addedge(int x,int y){
G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot;
G[++tot].to=x,G[tot].nxt=Head[y],Head[y]=tot;
}
int vis[N];
void dfs(int x){
vis[x]=;
for(register int j=Head[x];j;j=G[j].nxt)if(!vis[G[j].to])dfs(G[j].to);
}
int T,n,m,minst,maxst,flag;
struct dsu{
int anc[N];
inline void Clear(){for(register int i=;i<=n;++i)anc[i]=i;}
inline int Find(int x){return anc[x]==x?x:anc[x]=Find(anc[x]);}
}S;
int fib[]={,,,,,,,,,,,,,,,,,,,,,,,,};// int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
read(T);for(register int testcase=;testcase<=T;++testcase){
read(n),read(m);minst=maxst=flag=;
memset(Head,,sizeof Head);tot=;
for(register int i=;i<=m;++i)read(e[i].u),read(e[i].v),read(e[i].w),Addedge(e[i].u,e[i].v);
memset(vis,,sizeof vis);dfs();
for(register int i=;i<=n;++i)if(!vis[i]){flag=;break;}
if(flag){printf("Case #%d: No\n",testcase);continue;}
S.Clear();
for(register int i=;i<=m;++i)if(!e[i].w)if(S.Find(e[i].u)^S.Find(e[i].v))
S.anc[S.anc[e[i].u]]=S.anc[e[i].v];
for(register int i=;i<=m;++i)if(e[i].w)if(S.Find(e[i].u)^S.Find(e[i].v))
S.anc[S.anc[e[i].u]]=S.anc[e[i].v],++minst;
S.Clear();
for(register int i=;i<=m;++i)if(e[i].w)if(S.Find(e[i].u)^S.Find(e[i].v))
S.anc[S.anc[e[i].u]]=S.anc[e[i].v],++maxst;
for(register int i=;i<=m;++i)if(!e[i].w)if(S.Find(e[i].u)^S.Find(e[i].v))
S.anc[S.anc[e[i].u]]=S.anc[e[i].v];
int x=lower_bound(fib+,fib+,minst)-fib;
if(maxst>=fib[x])printf("Case #%d: Yes\n",testcase);
else printf("Case #%d: No\n",testcase);
}
return ;
}

总结:做生成树问题没有什么其他方法,所以还是最好多往MST上去想。。

hdu4786 Fibonacci Tree[最小生成树]【结论题】的更多相关文章

  1. HDU 4786 Fibonacci Tree 最小生成树

    Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description Coach Pang is intere ...

  2. hdu4786 Fibonacci Tree (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给定图的n个点和m条双向边,告诉你每条边的权值.权值为1表示该边是白边,权值为0表示该边为 ...

  3. 【最小生成树】【kruscal】hdu4786 Fibonacci Tree

    假设这张图能够形成具有k条白边的生成树, 则易证k一定形成一个连续的区间[a,b],中间一定不会断开.要是断开……tm怎么可能. 所以求出a,b就好啦,人家都给你把白边赋成1了,直接跑一下最小生成树, ...

  4. hdoj 4786 Fibonacci Tree【并查集+最小生成树(kruskal算法)】

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. Fibonacci Tree(最小生成树,最大生成树)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. hdu 4786 Fibonacci Tree(最小生成树)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  7. HDU 4786 Fibonacci Tree (2013成都1006题)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. POJ 4786 Fibonacci Tree

    Fibonacci Tree Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ...

  9. HDU 4786 Fibonacci Tree

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P ...

随机推荐

  1. SQL 查询建表SQL

    1.新建一个查询语句,按执行按钮 2.结果页面会显示一条sql语句,复制该语句即可建表 3.建表测试

  2. C++11 thread condition_variable mutex 综合使用

    #include <mutex> #include <condition_variable> #include <chrono> #include <thre ...

  3. webpack-dev-server 导致的 invalid host header

    这几天做的一个项目,在这个项目的 js 方面,我将其分业务和功能的拆分成模块化,然后使用 webpack 来进行打包.(第一次在公司产品中使用 webpack) 然后使用了 webpack-dev-s ...

  4. mysql在字符编辑窗口下怎么退出编辑界面?(mysql下的ctrl+c与\c)

    [1]SQL编辑 我们在SQL编辑的时候打错了,想要退出编辑重新输入,或者是不想写了. 如下图 (1)如果我们直接按ctrl+c中断,那么直接退出整个linux了,如上图 (2)我们可以使用\c,直接 ...

  5. IDEA插件之JProfiler

    1.是什么?来用干嘛的? 一个商业授权的Java剖析工具. 用来剖析程序内存.CPU使用情况,找到性能瓶颈,快速定位问题所在. 2.IDEA安装JProfiler插件 (1)File -> Se ...

  6. Vufuria入门 1 图片识别和选择

    Vufutia中的图片识别功能,底层主要是识别特征点来实现的.特征点,即那些棱角分明的点.尖锐的而不是圆滑的.对比度大的而不是小的. *** 步骤: 进入vofuria官网,登录,点击develop. ...

  7. composer在windows下安装并且设置全局变量

    Composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. 1丶使用安 ...

  8. xpath的一些常用使用

    xml文档<html> <head> <title>My page</title> </head> <body> <h2& ...

  9. pb相关小技巧或用法

    1.动态post window lwlw = w_main lw.dynamic post event ue_all(ls_no,ls_table) 2.打开隐藏窗口 IF NOT IsValid(w ...

  10. 使用 backdoor 工具注入ShellCode

    backdoor-factory 顾名思义,直接翻译过来就是后门工厂的意思.其利用打补丁的方式编码加密PE文件,可以轻松的生成win32PE后门程序,从而帮助我们绕过一些防病毒软件的查杀,达到一定得免 ...