• 暑假集训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 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    css清除select默认的样式
    网站性能优化的方法--Yahoo
    jQuery写toTop(回到顶部)效果
    jquery的addClass、removeClass、toggleClass方法
    css选择器汇总
    日期对象的正确写法
    顶会热词统计
    《人月神话》读后感二
    新闻详情页实现
    第八周总结
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/15077556.html
Copyright © 2020-2023  润新知