HDU 4786 Fibonacci Tree (2013成都1006题) 最小生成树+斐波那契

题意:问生成树里能不能有符合菲波那切数的白边数量

思路:白边 黑边各优先排序求最小生成树,并统计白边在两种情况下数目,最后判断这个区间就可以。注意最初不连通就不行。

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include<cmath>
 5 #define LL long long
 6 using namespace std;
 7 int t,n,m;
 8 int tot;
 9 int F[100010];
10 struct node {
11     int u,v,c;
12 } edge[100010];
13 int f[100010];
14 void init() {
15     f[0]=1;
16     f[1]=1;
17     tot=1;
18     while(f[tot]<=100010) {
19         f[tot+1]=f[tot]+f[tot-1];
20         tot++;
21     }
22 }
23
24 int findd(int x) {
25     if(F[x]==-1) return x;
26     else return F[x]=findd(F[x]);
27 }
28 bool cmp1(node a,node b) {
29     return a.c<b.c;
30 }
31 bool cmp2(node a,node b) {
32     return a.c>b.c;
33 }
34 int main() {
35     scanf("%d",&t);
36     int cas=0;
37     init();
38     while(t--) {
39         scanf("%d%d",&n,&m);
40         cas++;
41         for(int i=0; i<m; i++) {
42             scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].c);
43         }
44         sort(edge,edge+m,cmp1);
45         memset(F,-1,sizeof(F));
46         int cnt=0;
47         for(int i=0; i<m; i++) {
48             int x=findd(edge[i].u);
49             int y=findd(edge[i].v);
50             if(x!=y) {
51                 F[x]=y;
52                 if(edge[i].c==1)
53                     cnt++;
54             }
55         }
56         int low=cnt;
57         cnt=0;
58         memset(F,-1,sizeof(F));
59         sort(edge,edge+m,cmp2);
60         for(int i=0; i<m; i++) {
61             int x=findd(edge[i].u);
62             int y=findd(edge[i].v);
63             if(x!=y) {
64                 F[x]=y;
65                 if(edge[i].c==1)
66                     cnt++;
67             }
68         }
69         int high=cnt;
70         int flag=0;
71         for(int i=1; i<=n; i++) {
72             if(findd(1)!=findd(i)) {
73                 flag=1;
74                 break;
75             }
76         }
77         if(flag) {
78             printf("Case #%d: No\n",cas);
79             continue;
80         }
81         flag = false;
82         for(int i = 0; i <= tot; i++)
83             if(f[i] >= low && f[i] <= high)
84                 flag = true;
85         if(flag)
86             printf("Case #%d: Yes\n",cas);
87         else printf("Case #%d: No\n",cas);
88
89     }
90     return 0;
91 }

时间: 2024-12-19 17:49:57

HDU 4786 Fibonacci Tree (2013成都1006题) 最小生成树+斐波那契的相关文章

HDU 4786 Fibonacci Tree 最小生成树变形

思路: 这题比赛的时候想了好久,最后队友机智的想到了. 不过那时不是我敲的,现在敲的1A. 想好就容易了. 直接把1或者0当做边的权值,然后按边从小到大排序,然后算最小生成用到了几条白边,然后再按边从大到小排序,然后再算白边用了几条.然后最小和最大需要用到的白边都算出来了.如果在这最小最大区间中存在那个啥数列的话就是Yes,否则就是No. 为什么在这区间里面就是对的呢?刚开始我也想了好久,然后发现,因为白边权值是1,然后黑边是0,然后假设用到白边最小的是6,最大的是10,那么,我们可以用黑边去替

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

http://acm.hdu.edu.cn/showproblem.php?pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1733    Accepted Submission(s): 543 Problem Description Coach Pang is interested in

HDU 4786 Fibonacci Tree 并查集+生成树=kruskal

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2149    Accepted Submission(s): 682 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him t

hdu 4786 Fibonacci Tree(最小生成树)

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2952    Accepted Submission(s): 947 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him t

HDU 4786 Fibonacci Tree 生成树

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:有N个节点(1 <= N <= 10^5),M条边(0 <= M <= 10^5).当中一部分边被染成了黑色,剩下的边是白色,问能不能建立一棵树,树中有斐波那契数个白色边. 思路:用克鲁斯卡尔建三次树,第一是用全部边建树.推断能否建成一棵树,第二次用黑边建树,最多能够用到x条黑边(不成环),n-1-x就是最少须要用的白边的数量,第三次用白边建树,最多能够用到y条白边.假设在[y

hdu 4786 Fibonacci Tree ( 最小生成树 )

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2487    Accepted Submission(s): 796 Problem Description Coach Pang is interested in Fibonacci numbers while Uncle Yang wants him t

ABAP算法题:斐波那契(Fibonacci)数列

斐波那契(Fibonacci)数列是经典的递推关系式定义的数列. 第一项是0,第二项是1,之后的每一项都是前面两项之和. (sap labs面试题,要求用不同的方法在白板上写abap算法...毫无心理准备,第一遍写了一个递归,可能是复杂度不太好,面试官让我再写一个,于是写了如下代码) PARAMETERS: p_number TYPE i OBLIGATORY. DATA : x TYPE i VALUE 0, y TYPE i VALUE 1. " 算法1 CASE p_number. WHE

Project Euler 104:Pandigital Fibonacci ends 两端为全数字的斐波那契数

Pandigital Fibonacci ends The Fibonacci sequence is defined by the recurrence relation: F[n] = F[n-1] + F[n-2], where F[1] = 1 and F[2] = 1. It turns out that F541, which contains 113 digits, is the first Fibonacci number for which the last nine digi

刷题9 斐波那契数列及跳台阶问题

斐波那契数列问题描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.  n<=39 关于斐波那契数列, 定义是这样的: 因为递归太浪费空间, 所以采用循环: 1 class Solution { 2 public: 3 int Fibonacci(int n) { 4 if(n < 2) 5 return n; 6 int first = 0; 7 int second = 1; 8 int sum = -1; 9 for(int i = 0; i < n