`
暴风雪
  • 浏览: 390643 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[kruskal]hdoj 4786

 
阅读更多

大致题意:

       一个无向图中,每条边都是白边或者是黑边中的一种,问是否存在这个图的一颗生成树使得生成树中白边的个数为一个斐波那契数。

 

大致思路:

      求出生成树中白边可能的最大值和最小值,如果某个斐波那契数包含在最大值和最小值之间,则可判定存在这样的生成树。

       要注意判定这个图是否联通

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int nMax = 100020;

struct data{     // 每条边的数据结构。
    int u, v, w;
}edge[nMax];
int n, m, pa[nMax];

bool cmp(data a, data b){
    if(a.w < b.w) return true;
    return false;
}
bool cmp1(data a, data b){
    if(a.w > b.w) return true;
    return false;
}

void make_set(){       // 并查集:建立。
    for(int x = 1; x <= n; x ++)
        pa[x] = x;
}

int find_set(int x){   // 并查集:查找。
    if(x != pa[x])
        pa[x] = find_set(pa[x]);
    return pa[x];
}

int kruskal(int f){
    int i, ans = 0;
    make_set();
    if(f)sort(edge, edge + m, cmp);  //  对所有边按照权值从小到大排序。
    else sort(edge, edge + m, cmp1);
    for(i = 0; i < m; i ++){
        int x = find_set(edge[i].v);
        int y = find_set(edge[i].u);
        if(x != y){            
            pa[y] = x;
            ans += edge[i].w;
        }
    }
    return ans;
}

int fib[25]={1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,28657,46368,75025,121393};
int main(){
    int i,k,t,ttt;
    scanf("%d",&ttt);
    for(t=1;t<=ttt;t++){
        scanf("%d%d",&n,&m);
        for(i=0;i<m;i++){
            scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
        }
        int a=kruskal(1);
        int b=kruskal(0);

        if(a>=b){
            k=a,a=b,b=k;
        }

        bool flag=1;

        for(i=2;i<=n;i++){
            if(find_set(i)!=find_set(1)){
                flag=0;
                break;
            }
        }
        if(!flag){
            printf("Case #%d: No\n",t);
            continue;
        }
        flag=0;
        for(i=0;i<24;i++){
            if(a<=fib[i]&&b>=fib[i]){
                flag=1;
                break;
            }
        }
        if(flag)printf("Case #%d: Yes\n",t);
        else printf("Case #%d: No\n",t);
    }
}

 

0
0
分享到:
评论

相关推荐

    HDOJ.rar_HD_HDOJ

    3. **图论**:包括最短路径算法(Dijkstra、Floyd-Warshall、Bellman-Ford)、拓扑排序、最小生成树(Prim、Kruskal)等。 4. **数据结构**:如链表、栈、队列、树(二叉树、平衡树如AVL、红黑树)、图、堆、哈希表...

    ACM学习课件-HDOJ

    图论是ACM竞赛中常见的难题来源,包括最短路径问题(如Dijkstra算法、Floyd-Warshall算法)、最小生成树(Prim算法、Kruskal算法)以及拓扑排序等。掌握图论,可以解决很多实际生活中的复杂问题。 动态规划是一种...

    HDOJ暑期多校联赛第三场

    【HDOJ暑期多校联赛第三场】是2013年举办的一场面向广大编程爱好者的在线竞赛,由IOI(国际奥林匹克信息学竞赛)的冠军CLJ设计题目,旨在提升参赛者的信息学和算法解决能力。这次比赛涵盖了丰富的编程和算法知识点,...

    HDOJ2051-2099 acm的AC解题报告

    这些文件是关于ACM(国际大学生程序设计竞赛,简称ICPC)比赛的解题报告,主要涵盖杭电(杭州电子科技大学)在线评测系统HDOJ(HDU Online Judge)中的题目2051到2099。在ACM竞赛中,参赛队伍需要解决一系列算法问题...

    leetcode1198-Algorithm:HDOJ、力码

    图的算法包括但不限于深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(如Dijkstra算法、Floyd-Warshall算法)以及最小生成树算法(如Prim算法、Kruskal算法)等。 在LeetCode的1198题中,可能需要利用并...

    ACM_HDU:在 hdoj 中解决了我的 acm 问题的一部分

    7. **图论**:路径搜索(Dijkstra算法、Floyd算法)、最小生成树(Prim算法、Kruskal算法)、网络流等。 8. **数学基础**:组合数学、数论、几何等,许多题目需要一定的数学思维。 9. **字符串处理**:KMP算法、...

    hdu排序练习

    5. **图论算法**:包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(如Dijkstra算法、Floyd算法)、最小生成树算法(如Prim算法、Kruskal算法)等,用于解决图相关的复杂问题。 ### 知识点三:实战...

    ACM离线题库(1200道)

    3. **图论**:最短路径(Dijkstra、Floyd-Warshall、Bellman-Ford)、最小生成树(Prim、Kruskal)等。 4. **动态规划**:背包问题、最长公共子序列、矩阵链乘等。 5. **贪心算法**:活动安排、霍夫曼编码、最小花费...

    ACM算法讲解 附源码

    而`hdoj`可能指的是HDU(杭州电子科技大学)在线判题系统的题目,这些题目涵盖了各种ACM算法,可以作为练习和检验理解的平台。 总之,这个资源包是学习和提升ACM算法技能的理想材料,通过深入学习和实践,你可以...

    acm资料大全

    1. **基础算法**:包括排序(快速排序、归并排序、堆排序等)、搜索(深度优先搜索、广度优先搜索)、图论(最短路径算法如Dijkstra、Floyd-Warshall,最小生成树算法如Prim和Kruskal)、动态规划、回溯法等。...

    杭电acm教程 (贪心算法 动态规划等)

    在"(lecture_07)贪心算法080414.rar"中,将详细介绍贪心策略的选择原则和应用实例,如霍夫曼编码、最小生成树问题(Prim或Kruskal算法)、活动安排等经典问题。 2. **动态规划**: 动态规划是一种通过把原问题...

    杭电 acm 入门ppt

    2. **图论**:深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra、Floyd-Warshall)、最小生成树(Prim、Kruskal)等。 3. **动态规划**:状态转移方程、记忆化搜索、贪心策略等,用于解决背包...

    ACM课件.rarACM课件.rar

    4. 图论算法:最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Floyd-Warshall)、拓扑排序等在ACM竞赛中频繁出现。 5. 数学知识:组合数学、数论、离散数学等在解决某些复杂问题时起着关键作用。 6. 字符串处理...

    ACM算法基础(必备)

    熟练掌握这些基础知识后,你需要通过不断练习,参与在线判题平台(如LeetCode、Codeforces、HDOJ等)的题目,提高解决问题的能力。同时,学习他人的解题思路,了解如何在限制时间内构思、编写和调试代码,也是提升...

    杭州电子科技大学ACM评判系统离线题库

    2. **高级算法**:包括动态规划、贪心策略、回溯法、分支限界法、最短路径算法(如Dijkstra、Floyd-Warshall)、最小生成树(Prim、Kruskal)、图的遍历算法等。 3. **数学应用**:题目中可能会出现组合数学、数论...

    hdu题目分类

    从给定的信息来看,这是一份关于杭州电子科技大学(简称杭电)在线编程平台HDU Online Judge(简称HDOJ)的题目分类列表。这份列表为新手提供了按类别刷题的指南,帮助他们系统地提升算法和编程能力。下面,我们将...

    acm 过程中做过的一些习题和解答

    - **题库选择**:选择合适的在线平台进行训练非常重要,如Codeforces、HDOJ、UVA等,这些平台提供了丰富的题目供选手练习。 - **解题策略**:学会高效地分析问题,明确题目要求,确定使用的算法和数据结构。在编码...

Global site tag (gtag.js) - Google Analytics