hdu4786 Fibonacci Tree (最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786
题意:给定图的n个点和m条双向边,告诉你每条边的权值。权值为1表示该边是白边,权值为0表示该边为黑边。
问能否找到一颗生成树,使生成树白边的个数刚好为fibonacci数。如果能构成输出yes,否则输出no。
思路:这里有一个点要知道。因为是0,1 tree。 最小生成树<=生成树的值<=最大生成树。 注意,这个区间的任意一个值都能取到。
但是如果不是0,1 tree,权值就不是任意可取的了,这个要具体计算的(排列组合,这里先不考虑)。
剩下的看代码很容易懂。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=1e5+;
const int INF=0x3f3f3f3f; struct Node
{
int u,v,w;
} node[maxn*]; int n,m;
int p[maxn];
int F[]; int cmp1(Node x,Node y)
{
return x.w<y.w;
} int cmp2(Node x,Node y)
{
return x.w>y.w;
} int Find(int x)
{
if(x!=p[x]) p[x]=Find(p[x]);
return p[x];
} void Union(int x,int y)
{
x=Find(x);
y=Find(y);
p[y]=x;
} int kruskal()
{
int q=,ans=;
for(int i=; i<=m; i++)
{
if(Find(node[i].u) != Find(node[i].v))
{
ans+=node[i].w;
Union(node[i].u,node[i].v);
q++;
}
if(q==n-) break;
}
return ans;
} int main()
{
F[]=,F[]=;
int t;
for(t=; F[t]<maxn; t++)
F[t]=F[t-]+F[t-];
int T;
scanf("%d",&T);
for(int tt=; tt<=T; tt++)
{
scanf("%d%d",&n,&m);
for(int i=; i<=m; i++)
scanf("%d%d%d",& node[i].u,& node[i].v,&node[i].w);
int minn,maxx; for(int i=; i<=n; i++) p[i]=i;
sort(node+,node++m,cmp1);
minn=kruskal(); for(int i=; i<=n; i++) p[i]=i;
sort(node+,node++m,cmp2);
maxx=kruskal(); int flag=;
for(int i=; i<t; i++)
if(F[i]>=minn && F[i]<=maxx)
{
flag=;
break;
}
int fa=Find();
for(int i=; i<=n; i++)
if(Find(i)!=fa)
{
flag=;
break;
}
if(flag==) printf("Case #%d: Yes\n",tt);
else printf("Case #%d: No\n",tt);
}
return ;
}
hdu4786 Fibonacci Tree (最小生成树)的更多相关文章
- hdu4786 Fibonacci Tree[最小生成树]【结论题】
一道结论题:如果最小生成树和最大生成树之间存在fib数,成立.不存在或者不连通则不成立.由于是01图,所以这个区间内的任何生成树都存在. 证明:数学归纳?如果一棵树没有办法再用非树边0边替代1边了,那 ...
- HDU 4786 Fibonacci Tree 最小生成树
Fibonacci Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4786 Description Coach Pang is intere ...
- 【最小生成树】【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 ...
随机推荐
- 【BZOJ1211】树的计数(Prufer编码)
题意:一个有n个结点的树,设它的结点分别为v1, v2, …, vn, 已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵. 其中1<=n<=150,输入数据保证满足条件的 ...
- java HashMap的使用
java HashMap的使用 import java.util.HashMap; import java.util.Iterator; public class WpsklHashMap { pub ...
- Fedora20 安装 MySQL
参考资料: http://www.cnblogs.com/focusj/archive/2011/05/09/2057573.html http://linux.chinaunix.net/techd ...
- FATE---hdu2159(二重背包)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- P1359 租用游艇 洛谷
https://www.luogu.org/problem/show?pid=1359 题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n.游客可在这些游艇出租站租用游艇,并在下游的 ...
- Topcoder SRM 657DIV2
前言: 像我这样一直在DIV2的弱菜..不知道说什么了. A:一定判断有8个‘R’,每行 每列只有一个 B题:大概是 int E,int EM,int M,int MH,int H 然后EM可以给值 ...
- [Bzoj3668][Noi2014]起床困难综合症(位运算)
3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2612 Solved: 1500[Submit][St ...
- System表空间大小有10Gb,使用率达到95%,
System表空间大小有10Gb,使用率达到95%,很好奇, 随后执行如下SQL,查看system表空间中使用空间最多的对象 SQL>SELECT * FROM DBA_SEGMENTS T W ...
- JAVA_如何复制项目
如何复制一个项目:复制这个项目,直接粘贴为一个新项目 注意复制完了之后一定要改一下Web Context-root 然后重新部署(注意Servers的Tomcat会变成当前项目,还要注意他的L ...
- HTC 328T 提示手机存储不足 out of space怎么办
不要再用什么软件做优化,做清理,都是治标不治本啊. 1 用豌豆荚备份数据 2 手机恢复出厂设置 3 用豌豆荚恢复数据