zoukankan      html  css  js  c++  java
  • 暑假集训Day15 D (数学 最小生成树)

    题目链接在这里:Problem - D - Codeforces

    这题涉及到两个与Fibonacci数列有关的性质

    一个是一定不存在两个Fibonacci数列项之和等于另外两个Fibonacci数列项 所以最小生成树是唯一的,不存在多解的情况,这样让最大度最小这点可以忽略

    另一个是假设a,b,c,d是四个Fibonacci数列项,如果a>b>(c,d)则对于任意c和d都有a+c>b+d,这点可以用来判断边权的大小

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 const int MAX=2e5+5;
     4 int n,m,fa[MAX],d[MAX],ans;
     5 struct Edge{
     6     int u,v;
     7 }ee[MAX];
     8 bool cmp(Edge x,Edge y){
     9     if (x.v==y.v) return x.u<y.u;
    10     return x.v<y.v;
    11 }
    12 inline getfather(int x){return fa[x]==x?x:fa[x]=getfather(fa[x]);}
    13 int main(){
    14     freopen ("d.in","r",stdin);
    15     freopen ("d.out","w",stdout);
    16     int i,j,u,v,tx,ty;
    17     scanf("%d%d",&n,&m);
    18     for (i=1;i<=m;i++){
    19         scanf("%d%d",&u,&v);
    20         ee[i].u=min(u,v);
    21         ee[i].v=max(u,v);
    22     }
    23     sort(ee+1,ee+m+1,cmp);
    24     for (i=1;i<=n;i++) fa[i]=i;
    25     for (i=1;i<=m;i++){
    26         tx=getfather(ee[i].u);
    27         ty=getfather(ee[i].v);
    28         if (tx!=ty){
    29             fa[tx]=ty;
    30             d[ee[i].u]++,d[ee[i].v]++;
    31         }
    32     }ans=0;
    33     for (i=1;i<=n;i++) ans=max(ans,d[i]);
    34     printf("%d",ans);
    35     return 0;
    36 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    最小最大数
    ubuntu14.04在虚拟环境中安装flask遇到的问题
    线性时间排序
    NSURLSession详细介绍,以及一些坑位的介绍
    IOS笔记 本地化多语言支持
    Documenting in Xcode with HeaderDoc Tutorial
    高效使用你的Xcode
    Xcode 7遇到 App Transport Security has blocked a cleartext HTTP 错误
    iOS bug解决方案(02)
    CGRect 的使用
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/15077556.html
Copyright © 2011-2022 走看看