首页 > 其他分享 >CF 1805 D. A Wide, Wide Graph (*1800) 思维 + 树的直径

CF 1805 D. A Wide, Wide Graph (*1800) 思维 + 树的直径

时间:2024-10-05 18:01:03浏览次数:8  
标签:Wide 1805 1800 int dfs st 端点 dis

CF 1805 D. A Wide, Wide Graph (*1800) 思维 + 树的直径

题目链接

题意

思路

若当前点到最远的点的距离 \(< k\) , 说明 \(x\) 自己成为一个联通块。

并且我们知道距离任意一点最远的点一定是树直径的一个端点。

反之,则与直径端点在同一个联通块。

所以一个点要么独立成为联通块,要么和直径端点在一个联通块。

\(dfs\) 求出直径两个端点,并且维护每个点到端点的距离即可。

代码

#include<bits/stdc++.h>

using namespace std;

using i64=long long;

void Showball(){
     int n;
     cin>>n;
     vector<vector<int>> e(n);
     for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        u--;
        v--;
        e[u].push_back(v);
        e[v].push_back(u);
     }

     vector<int> st(n),dis(n);

     function<void(int)> dfs=[&](int u){
        for(auto v:e[u]){
            if(st[v]) continue;
            st[v]=true;
            dis[v]=dis[u]+1;
            dfs(v);
        }
     };

     st[0]=1;
     dfs(0);
     int maxn=0,S,E;
     for(int i=0;i<n;i++){
        if(dis[i]>maxn){
            maxn=dis[i];
            S=i;
        }
        dis[i]=st[i]=0;
     }
     st[S]=1;
     dfs(S);
     auto dis2=dis;
     
     maxn=0;
     for(int i=0;i<n;i++){
        if(dis[i]>maxn){
            maxn=dis[i];
            E=i;
        }
        dis[i]=st[i]=0;
     }
     st[E]=1;
     dfs(E);
     vector<int> ans(n+1);
     for(int i=0;i<n;i++){
        if(i!=E) ans[max(dis[i],dis2[i])+1]++;
     }
     ans[0]=1;
     for(int i=1;i<=n;i++) ans[i]+=ans[i-1];
     for(int i=1;i<=n;i++) cout<<ans[i]<<" \n"[i==n];
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    //cin>>t;

    while(t--){
      Showball();
    }

    return 0;
}

标签:Wide,1805,1800,int,dfs,st,端点,dis
From: https://www.cnblogs.com/showball/p/18448187

相关文章

  • 18057 ASCII码值之和的差
    **思路**:1.读取两个字符串`s1`和`s2`。2.计算每个字符串中所有字符的ASCII码值之和。3.计算两个字符串的ASCII码值之和的差。4.输出结果。**伪代码**:1.读取字符串`s1`。2.读取字符串`s2`。3.初始化`sum1`和`sum2`为0。4.对于`s1`中的每个字......
  • 【无线通信发展史⑨】1791年路易吉·伽伐尼-关于动物电的研究与1800年亚历山大·伏打
       前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。我为什么会写这个系列呢?        首先肯定是因为我本身就是一名从业通信者,想着更加了解自己专业的知识,所以更想着从头......
  • 文献解读- Genome-wide imputation using the practical haplotype graph in the hete
    关键词:农业;基因测序;变异检测;文献简介标题(英文):Genome-wideimputationusingthepracticalhaplotypegraphintheheterozygouscropcassava标题(中文):使用杂合作物木薯中的实用单倍型图进行全基因组插补发表期刊:G3作者单位:康奈尔大学等发表年份:2021文章地址:https://doi.org/10.10......
  • 春秋云镜CVE-2022-28525(ED01-CMS v20180505 存在任意文件上传漏洞)
    1:访问靶机发现是登录界面2:尝试使用弱口令爆破(明文传输)3:添加pyload并选择攻击类型字典我们随便选择的,实际情况需要实际定义爆破成功,用户名:admin密码:admin登录成功4:找到如图模块,上传图片马上传成功(上传时需要抓包改上传类型)5:使用蚁剑连接,拿到flag......
  • Microsoft 365(Office 365)ProPlus x64 v16.0.18007.20000 特别版
    概述Microsoft365是微软公司推出的一款集成办公套件软件,整合了Office应用程序、云存储、电子邮件服务以及其他生产力工具,旨在为个人和企业用户提供全面且便捷的办公解决方案。软件功能Office应用程序:Microsoft365包括常见的Office应用程序,如Word、Excel、PowerPoint和Outloo......
  • CF 1981 D. World is Mine (*1800) DP+博弈论
    CF1981D.WorldisMine(*1800)DP+博弈论题目链接题意:有\(n\)个蛋糕,每个蛋糕有一个美味值\(a_i\),\(Alice\)和\(Bob\)轮流吃蛋糕,\(Alice\)每次必须选择吃严格大于之前所吃的蛋糕美味程度。\(Bob\)随意选择。有人没有蛋糕可以吃时,游戏结束。\(Alice\)想吃更多......
  • CF 1968 F. Equal XOR Segments (*1800) 思维
    CF1968F.EqualXORSegments(*1800)思维题意:给你一个长度为\(n\)的数组,如何可以把数组分成\(k(k>1)\)组,并且使得每组的异或和相等,那么这个数组就是完美的。现在给你\(q\)组询问,每次给你\(l,r\)。请你判断\(a_l\)到\(a_r\)之间是否是完美的。思路:对于每次询问......
  • GB-T 18003-2024 人造板机械 设备型号编制方法
    GB-T18003-2024人造板机械设备型号编制方法编写背景随着人造板行业的快速发展,标准化的设备型号编制方法对于提高行业内部的沟通效率、促进设备管理的规范化具有重要意义。GB-T18003-2024标准是针对人造板机械领域制定的一项国家级推荐性标准,旨在统一人造板机械设备的......
  • 2024最新西瓜视频收益玩法,一台电脑即可 新手小白简单操作单号月入1800+
    在数字时代的浪潮中,短视频领域成为了一个巨大的流量池。抖音,无疑站在了这股浪潮的顶端,吸引了无数的观众和创作者。然而,对于初出茅庐的新手来说,要想在抖音中脱颖而出,并非易事。很多时候,成功似乎和运气有着千丝万缕的联系,这让许多新手感到无从下手。幸运的是,随着视频号的......
  • [ES2024] Improve Application-wide Error Handling rethrowing JavaScript Error wit
    Thenew cause datapropertythatyoucanaddtoathrown Error canbeusedtoretainaccesstotheoriginalerrorcaughtinapromiserejection. constsendLog=(...args)=>console.log(...args);asyncfunctionfetchStuff(){awaitfetch('h......