hdu 4786 Fibonacci Tree (最小、最大生成树)
题意:
N个点,M条边。每条边连接两个点u,v,且有一个权值c,c非零即一。
问能否将N个点形成一个生成树,并且这棵树的边权值和是一个fibonacii数。 (fibonacii数=1,2,3,5,8 .... )
思路:
若可以生成一棵树。则有最小生成树和最大生成树。假设已经生成了最小MST P 和最大MST Q。
将P更换一条边可以得到另一棵生成树,边权和不是和P相等就是比P的边权和大1。(因为边值非零即一)。同理搞下去....一定可以得到Q。
所以P的边权和到Q的边权和之间的所有值都能得到。故判断之间是否存在fibonacii数即可。
代码:
struct node{
int u,v,c;
}edge[100005];
bool cmp(node a,node b){
return a.c<b.c;
}
int fa[100005];
int T,n,m;
int findFa(int x){
return fa[x]==x?x:fa[x]=findFa(fa[x]);
}
int kruskal1(){
rep(i,1,n) fa[i]=i;
int res=0;
rep(i,1,m){
int fx=findFa(edge[i].u);
int fy=findFa(edge[i].v);
if(fx!=fy){
fa[fx]=fy;
res+=edge[i].c;
}
}
int tx=findFa(1);
rep(i,2,n) if(findFa(i)!=tx) return -1;
return res;
}
int kruskal2(){
rep(i,1,n) fa[i]=i;
int res=0;
rep2(i,m,1){
int fx=findFa(edge[i].u);
int fy=findFa(edge[i].v);
if(fx!=fy){
fa[fx]=fy;
res+=edge[i].c;
}
}
int tx=findFa(1);
rep(i,2,n) if(findFa(i)!=tx) return -1;
return res;
}
bool isFibo[100005];
void FiboD(){
mem(isFibo,false);
int a=1,b=2; isFibo[1]=isFibo[2]=true;
for(;;){
int t=a+b;
a=b, b=t;
if(t>100000) break;
isFibo[t]=true;
}
}
int main(){
//freopen("test.in","r",stdin);
cin>>T;
FiboD();
rep(t,1,T){
scanf("%d%d",&n,&m);
rep(i,1,m)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].c);
sort(edge+1,edge+1+m,cmp);
int mins=kruskal1();
int maxs=kruskal2();
printf("Case #%d: ",t);
if(mins==-1 || maxs==-1) puts("No");
else{
bool flag=false;
rep(i,mins,maxs) if(isFibo[i]){
flag=true;
break;
}
if(flag) puts("Yes"); else puts("No");
}
}
//fclose(stdin);
}
hdu 4786 Fibonacci Tree (最小、最大生成树)的更多相关文章
- HDU 4786 Fibonacci Tree(生成树,YY乱搞)
http://acm.hdu.edu.cn/showproblem.php? pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others ...
- hdu 4786 Fibonacci Tree (2013ACMICPC 成都站 F)
http://acm.hdu.edu.cn/showproblem.php?pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 4786 Fibonacci Tree 最小生成树
Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description Coach Pang is intere ...
- HDU 4786 Fibonacci Tree
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) P ...
- HDU 4786 Fibonacci Tree (2013成都1006题)
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 生成树
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:有N个节点(1 <= N <= 10^5),M条边(0 <= M <= ...
- 【HDU 4786 Fibonacci Tree】最小生成树
一个由n个顶点m条边(可能有重边)构成的无向图(可能不连通),每条边的权值不是0就是1. 给出n.m和每条边的权值,问是否存在生成树,其边权值和为fibonacci数集合{1,2,3,5,8...}中 ...
- hdu 4786 Fibonacci Tree 乱搞 智商题目 最小生成树
首先计算图的联通情况,如果图本身不联通一定不会出现生成树,输出"NO",之后清空,加白边,看最多能加多少条,清空,加黑边,看能加多少条,即可得白边的最大值与最小值,之后判断Fibo ...
随机推荐
- ACID的实现原理
引言 ACID是事务的特点也是必须的要求,只有保证ACID事务的执行才不会出错,分别是原子性.一致性.隔离性和持久性.我们知道典型的MySQL事务是这样执行的: start transaction 开 ...
- PHP的DBA扩展学习
今天我们讲的 DBA 并不是传统的数据库管理员那个 DBA ,而是一个 PHP 中的巴克利风格数据库的扩展.巴克利风格数据库其实就是我们常说的键值对形式的 K/V 数据库.就像我们平常用得非常多的 m ...
- 解决wampserver无法启动问题
如果无法启动,找不到原因.直接依次点击打开到:控制面板--管理工具--事件查看器--windows日志--应用程序,查看对应进程错误信息对症下药即可. 我这个错误就是8099端口错误,运行cmd命令, ...
- 博客主题——element v2
主题预览 主题下载 gshang.element-v2.rar
- 小白一看就懂的postman教程
Postman的安装和注册 下载 直接在官网下载 https://www.postman.com/downloads/ postman有两种形式 客户端,下载后安装使用 网页版,在浏览器登录postm ...
- hadoop 学习笔记二
NameNode的持久化(persistent)(day4,1) 类似于:Redis redis中的持久化文件是相互独立的当两个持久化文件同时存在时默认使用的是aof ,但是namenode 的持久化 ...
- vm中安装win2012并安装hyper-V不支持嵌套
在虚拟机中安装win2012,并安装hyper-v提示: 无法安装hyper-v:虚拟机监控程序已经在运行 找到虚拟机目录下,用文本编辑器打开该系统的虚拟机配置文件(.vmx后缀),在配置文件末尾增加 ...
- Linux服务器时间同步配置
Linux服务器时间同步配置 以CentOS7 做时间服务器,其他服务器(Centos 6.RHEL7)同步该服务器时间 RHEL 7.CentOS 7 默认的网络时间协议 为Chrony 本教程 ...
- ❤️❤️新生代农民工爆肝8万字,整理Python编程从入门到实践(建议收藏)已码:8万字❤️❤️
@ 目录 开发环境搭建 安装 Python 验证是否安装成功 安装Pycharm 配置pycharm 编码规范 基本语法规则 保留字 单行注释 多行注释 行与缩进 多行语句 数据类型 空行 等待用户输 ...
- Python setattr() 函数 ,Python super() 函数: Python 内置函数 Python 内置函数
描述 setattr 函数对应函数 getatt(),用于设置属性值,该属性必须存在. 语法 setattr 语法: setattr(object, name, value) 参数 object -- ...