链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786

题意:给出n个点,m条边,和边的信息。

边有两种颜色,白色和黑色。现要求构造一个生成树。看是否能满足白边的数量是斐波那契数。

这道题比赛的时候,小白想到了一种方法:按边颜色排序后,先用白边优先建树,求出最大白边最大个数maxm,再用黑边优先建树,求出白边最小个数minm。看这两个范围内是否存在斐波那契数。

听上去感觉还挺有道理,可是不知道怎么证明正确性,后来想想,生成树构造完之后。再加入随意一条边都会产生回路。而产生回路之后就有边会被替换,而minm是最少的白边数,也就是minm个白边是不会被换掉的。maxm同理,所以中间的回路替换掉边总能保证用白边替换黑边,或者黑边替换白边。所以能够这么做。

我信心满满的開始敲。然后WA了。。

由于我写完cmp函数后忘记写sort了,并且还过了例子。改过之后交一发。还是WA。后来发现数组开了110。。。并且提示是WA不是RE

另外,这道题假设不进行路径压缩,会超时

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 110000
#define eps 1e-7
#define INF 0x7FFFFFFF
#define seed 131
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct node{
int u,v,col;
}edge[MAXN];
int father[MAXN],fi[90];
int n,m,flag;
bool cmp(node x,node y){
return x.col>y.col;
}
int find(int x){
int t = x;
while(father[t]!=t){
t = father[t];
}
int k = x;
while(k!=t){
int temp = father[k];
father[k] = t;
k = temp;
}
return t;
}
void solve(){
int i,j=0;
int flag2 = 0;
int minm,maxm;
minm = maxm = 0;
sort(edge,edge+m,cmp);
for(i=0;i<m;i++){
int a = find(edge[i].u);
int b = find(edge[i].v);
if(a!=b){
if(edge[i].col==1) maxm++;
father[a] = b;
j++;
if(j>=n-1){
flag2 = 1;
break;
}
}
}
if(flag2==0){
return ;
}
for(i=1;i<=n;i++){
father[i] = i;
}
j = 0;
for(i=m-1;i>=0;i--){
int a = find(edge[i].u);
int b = find(edge[i].v);
if(a!=b){
if(edge[i].col==1) minm++;
father[a] = b;
j++;
if(j>=n-1) break;
}
}
//cout<<minm<<" "<<maxm<<endl;
for(i=1;i<45;i++){
if(fi[i]>=minm&&fi[i]<=maxm)
{
flag = 1;
break;
}
}
}
int main(){
int i,j,k=1,t;
int a,b,c;
fi[1] = 1;
fi[2] = 2;
for(i=3;i<45;i++){
fi[i] = fi[i-1] + fi[i-2];
//cout<<fi[i]<<" "<<i<<" "<<endl;
}
scanf("%d",&t);
while(t--){
flag = 0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) father[i] = i;
for(i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
edge[i].u = a;
edge[i].v = b;
edge[i].col = c;
}
solve();
if(flag) printf("Case #%d: Yes\n",k++);
else printf("Case #%d: No\n",k++);
}
return 0;
}

HDOJ--4786--Fibonacci Tree【生成树】的更多相关文章

  1. HDU 4786 Fibonacci Tree(生成树,YY乱搞)

    http://acm.hdu.edu.cn/showproblem.php? pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others ...

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

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

  3. HDU 4786 Fibonacci Tree 生成树

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:有N个节点(1 <= N <= 10^5),M条边(0 <= M <= ...

  4. hdu 4786 Fibonacci Tree (2013ACMICPC 成都站 F)

    http://acm.hdu.edu.cn/showproblem.php?pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) ...

  5. HDU 4786 Fibonacci Tree 最小生成树

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

  6. HDU 4786 Fibonacci Tree

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

  7. POJ 4786 Fibonacci Tree

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

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

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

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

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

  10. hdu 4786 Fibonacci Tree (最小、最大生成树)

    题意: N个点,M条边.每条边连接两个点u,v,且有一个权值c,c非零即一. 问能否将N个点形成一个生成树,并且这棵树的边权值和是一个fibonacii数. (fibonacii数=1,2,3,5,8 ...

随机推荐

  1. C#开发攀爬集锦

    工具使用 Files has invalid value "<<<<<<< .mine". Illegal characters in p ...

  2. Navigation bar 的注意事项

    Navigation bar 的注意事项 Bar button item 使用 button 作为 custom view,初始化 isEnabled 为 false,注意顺序 需要设置 bar bu ...

  3. 查看sqlserver数据库的端口号

    最近正在用sqlserver作为java的数据库进行开发,在写连接字符串的时候,想起一个问题,怎么查找sqlserver的端口号呢?有两种方法 1,用存储过程 --查询端口号exec sys.sp_r ...

  4. iOS开发之本地化

    一.简介 * 使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言 * 如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lpr ...

  5. unidac连接FireBird数据库

    dbconn: TUniConnection; with dbconn do    begin      if not Connected then         begin            ...

  6. Log4j与common-logging

    Log4j与common-logging 总网上搜了些Log4j与common-logging的介绍,记录下. 一.Log4j  1.简介 Log4j是Apache的一个开放源代码项目 使用Log4j ...

  7. web服务编码设置

    response设置编码. <%@ page contentType="text/html;charset=UTF-8" %> 是服务器端java程序运行时的输出编码, ...

  8. discuz论坛很给力

    11.10:老彭在搭建好论坛. 11.17:  主网站导航中加入“论坛” 11.20: 使用“T客在线”的版本将论坛全新改版. 新版论坛非常大气,让网站增色不少.

  9. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

  10. Listview 异步加载图片之优化篇(有图有码有解释)

    在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...