hdu4786 Fibonacci Tree[最小生成树]【结论题】
一道结论题:如果最小生成树和最大生成树之间存在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[最小生成树]【结论题】的更多相关文章
- HDU 4786 Fibonacci Tree 最小生成树
Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description Coach Pang is intere ...
- hdu4786 Fibonacci Tree (最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给定图的n个点和m条双向边,告诉你每条边的权值.权值为1表示该边是白边,权值为0表示该边为 ...
- 【最小生成树】【kruscal】hdu4786 Fibonacci Tree
假设这张图能够形成具有k条白边的生成树, 则易证k一定形成一个连续的区间[a,b],中间一定不会断开.要是断开……tm怎么可能. 所以求出a,b就好啦,人家都给你把白边赋成1了,直接跑一下最小生成树, ...
- hdoj 4786 Fibonacci Tree【并查集+最小生成树(kruskal算法)】
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Fibonacci Tree(最小生成树,最大生成树)
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 4786 Fibonacci Tree(最小生成树)
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 4786 Fibonacci Tree (2013成都1006题)
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- POJ 4786 Fibonacci Tree
Fibonacci Tree Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ...
- HDU 4786 Fibonacci Tree
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) P ...
随机推荐
- C#实现排列、组合
排列组合的概念 排列:从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement). 组合:从m个不同的元素中,任取n(n≤m)个元 ...
- Vue Cli3.0 使用jquery
参考链接:https://blog.csdn.net/ai520587/article/details/84098601
- [Python3 填坑] 004 关于八进制
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 问题的由来 2.2 问题的解决 2.2.1 先说结论 2.2.2 八进制的用途 2.2.3 少废话,上例子 1. print( 坑的信息 ...
- 1.5JdbcTmeplates、Jpa、Mybatis、beatlsql、Druid的使用
Spring boot 连接数据库整合 -- create table `account`DROP TABLE `account` IF EXISTSCREATE TABLE `account` ( ...
- (五)mybatis开发dao层
目录 SqlSession 是线程不安全的 原始 dao 开发方法 Mapper 代理方法 关于代理对象 SqlSession 是线程不安全的 SqlSession 是 线程不安全 的: 对于它,我们 ...
- HDU 3333-Turing Tree-线段树+离散+离线
Description After inventing Turing Tree, 3xian always felt boring when solving problems about interv ...
- selenium弹框元素定位-冻结界面
有些网站上面的元素,我们鼠标放在上面,会动态弹出一些内容. 比如,百度首页的右上角,有个更多产品选项,如下图所示: 如果我们把鼠标放在上边,就会弹出下面的百度营销.音乐.图片等图标. 如果我们要用se ...
- 20190716-Python网络数据采集/第 2 章 复杂HTML解析
# P29/9# 解析,要考虑到可持续性问题,对方反爬修改后,仍继续有效,方为优秀代码# 解析一个目标网页前,需要做到以下几点:(1)明确目标内容:(2)寻找“打印此页”的链接,或查看网站有无HTML ...
- Istio技术与实践02:源码解析之Istio on Kubernetes 统一服务发现
前言 文章Istio技术与实践01: 源码解析之Pilot多云平台服务发现机制结合Pilot的代码实现介绍了Istio的抽象服务模型和基于该模型的数据结构定义,了解到Istio上只是定义的服务发现的接 ...
- 怎样理解"不推荐不使用var的变量声明方式"这句话
答: 因为不使用var声明的变量不会被预解析, 如下: console.log(a); console.log(b); var a = 1; b = 2;