首页 > 其他分享 >CF1805D A Wide, Wide Graph

CF1805D A Wide, Wide Graph

时间:2023-07-04 11:01:33浏览次数:62  
标签:Wide dep Graph mx1 int maxn 端点 CF1805D 直径

也许更好的阅读体验

\(\mathcal{Description}\)
给你一棵有 \(n\) 个结点的树,定义 \(G_k\)为将在原树中所有距离大于等于 \(k\) 的点对间连一条无向边所构成的无向图(距离定义为简单路径中边的数量)。
对于所有 \(1 \le k \le n\),求 \(G_k\)​ 中连通块的数量。
\(2\le n\le 10^5\)
\(\mathcal{Solution}\)
设树的直径为\(d\),对于\(k > d\)的情况,\(G_k\)中没有边,连通块的数量为\(n\)
以下是我的思考过程,逐渐从比较麻烦的想法变得简单
可以先看正解,没看懂再回来看
考虑\(k\)从大变小的过程,之前连了的边\(k\)变小后也会连,因此可以考虑每次增加的新点
这时候想到了直径,假设整棵树只有一条直径,\(k=d\)时,只有直径的两个端点是连在一起的,考虑\(k\)变小的过程,因为任意一个点到其它点最远的距离就是到这条直径的某个端点,最开始两个端点连了边,当\(k\)变小\(i\),可以认为从直径的一个端点出发最多走\(i\)步,所到达的这些点都会和直径的另一个端点连起来
如图,两个直径端点在\(k\)变小的过程会不断新增另一端点附近的点
pCrLEJs.png
这样的过程可以用\(bfs\)模拟出来,目前这种做法仍然有问题,一是树并不是只有一条直径,对于多条直径其实也可以用\(dfs\)找出来然后再\(bfs\)模拟,二是比较关键的问题,如下的情况并没有被正确考虑到

pCrL8Y9.png
蓝色的点对于左端点而言要走三步下才能到达,而对右端点而言,它们的距离为\(d-1\),应该早就被连边,而在我们的\(bfs\)模拟的方法中,并没能正确的连接到

以下是正解部分
现在让我们舍弃掉\(bfs\)这个愚蠢的方法,首先重新捋一下几个性质

  • 所有直径端点在\(k=d\)时都会连边进同一个连通分量
  • 除了和直径端点在同一个连通分量里的点,其它点都是独立的大小为1连通分量
  • 离直径端点距离为\(i\)的点,在\(k=i\)时会和直径端点连边

根据以上性质,我们可以发现我们需要求出的东西是,每个点到所有直径端点的距离中最远距离\(dm\),这个点会在\(k=dm\)时,进入直径端点所在连通分量,也就是连通分量数会减少\(1\),令\(i=d-dm\),也就是当\(k\)从\(d\)开始减少\(i\)时联通分量数会减少\(1\)
现在问题就变成了有若干个点(直径端点),求每个点到这些点最远的距离
因为是直径端点,因此会有一些性质让问题变得好求,首先如果有多个直径,并且这些直径的端点没有相同的点时,这两些直径的交点一定是在距离某个直径端点\(d/2\)的位置
若直径为偶数,我们把这个树从直径中间的位置提起来
pCrOa3n.png
这时,这棵树的深度不会超过\(d/2\),任意一点都可越过根节点走到某一个直径端点,也就是说任意一点到某个直径端点的最长距离为\(\frac{d}{2}+dep-1\),对应的\(i=\frac{d}{2}-dep+1\)
而对于直径为奇数的情况
我们也找到中间位置
pCrXJr6.png
先考虑右边这部分,将红色的点提出来作为根节点,这时只考虑右边这部分点,不考虑左边的点,这些点可以越过根节点然后走到某一个离红色点长度为\(\frac{d}{2}+1\)的直径端点,也就是说最长距离为距离为\(\frac{d}{2}+dep\),对应的\(i=\frac{d}{2}-dep+1\)
而对于左边这部分,我们只需把红色的点往左移一次,就能变成相同的情况了
我们发现直径为奇数和偶数的情况得到的\(i\)的计算式子是一样的,因此可以共用同一个\(dfs\)解决
现在只剩下一个简单的问题,如何找到直径的中点,这个问题应该有很多种解决办法,我是使用记录儿子中最深和次深的点是谁来求直径,并记录找到直径的结点,顺便用\(s[i]\)表示以\(i\)为根节点的子树到最深的点应该往\(i\)的哪个儿子走,这样只需从之前记录的结点开始每次都往\(s[i]\)的方向走,直到找到最深和次深的深度相同或者相差一就找到了一条直径的中点了
所有的点的\(i\)都得到了,之后我们就可以直接计算在\(k=d-i\)时会减少多少个连通分量了,问题就解决了

\(\mathcal{Code}\)

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 200005;
int n, cnt, d, g;
int head[maxn], nxt[maxn], to[maxn];
int mx1[maxn], mx2[maxn], dep[maxn], s1[maxn];
int ans[maxn], need[maxn];
queue <int> q;
void add (int u, int v)
{
    nxt[++cnt] = head[u], head[u] = cnt, to[cnt] = v;
}
void dfs1 (int u, int father)
{
    dep[u] = dep[father] + 1;
    mx1[u] = mx2[u] = u;
    for (int e = head[u]; e; e = nxt[e])
        if (to[e] != father) {
            dfs1(to[e], u);
            if (dep[mx1[to[e]]] > dep[mx2[u]])    mx2[u] = mx1[to[e]];
            if (dep[mx2[u]] > dep[mx1[u]])    swap(mx1[u], mx2[u]);
            if (mx1[to[e]] == mx1[u])   s1[u] = to[e];
        }
    int dis = dep[mx1[u]] + dep[mx2[u]] - 2 * dep[u];
    if (dis > d) {
        d = dis;
        g = u;
    }
}
void dfs2 (int u, int father)
{
    dep[u] = dep[father] + 1;
    need[u] = min(need[u], d / 2 - (dep[u] - 1));
    for (int e = head[u]; e; e = nxt[e])
        if (to[e] != father) dfs2(to[e], u);
}
int main ()
{
    scanf("%d", &n);
    for (int i = 2, u, v; i <= n; ++i) {
        scanf("%d%d", &u, &v);
        add(u, v), add(v, u);
    }
    for (int i = 1; i <= n; ++i)    need[i] = n;
    dfs1(1, 0);
    for (int i = n; i > d; --i) ans[i] = n;
    if (d & 1) {
        while (dep[mx1[g]] - dep[g] != d / 2 + 1)   g = s1[g];
        dep[s1[g]] = 0;
        dfs2(g, s1[g]);
        dep[g] = 0;
        dfs2(s1[g], g);
    }
    else {
        while (dep[mx1[g]] - dep[g] != d / 2)   g = s1[g];
        dfs2(g, 0);
    }
    for (int i = 1; i <= n; ++i)    --ans[d - need[i]];
    ++ans[d];
    for (int i = d; i; --i) ans[i] += ans[i + 1];
    for (int i = 1; i <= n; ++i)    printf("%d%c", ans[i], " \n"[i == n]);
    return 0;
}

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧

标签:Wide,dep,Graph,mx1,int,maxn,端点,CF1805D,直径
From: https://www.cnblogs.com/Morning-Glory/p/17525106.html

相关文章

  • GraphPad Prism 9-科研医学数据绘图分析mac/win版
    GraphPadPrism9是一款功能强大、易于使用的科研和医学数据处理软件。它可以帮助研究人员进行数据可视化、统计分析和实验结果解读,提供了广泛的功能和工具,使得数据呈现更直观且易于理解。→→↓↓载GraphPadPrism9mac/win版 Prism9的主要特点之一是其直观的用户界面。软......
  • system halt during installation with NV graphics card.
    Icheck,itseemsitisstuckat"GETubiquity/install_oem".Canyoucheck/var/cache/debconf/config.dat,iftheubiquity/install_oemvalueisTrue.itisin/usr/share/ubiquity/simple-pluginsscript,itsetthedbtotrueandgetitdirectlyin......
  • 开发实用小技巧(1):RuntimeError: 'cryptography' package is required for sha256_passw
    问题:RuntimeError:'cryptography'packageisrequiredforsha256_passwordorcaching_sha2_passwordauthmethods这个错误通常是由于在使用MySQL数据库时,未安装或功能不完整的“cryptography”包所引起的,所以下载“cryptography”这个包即可!!!解决思路:pipinstallcryptogr......
  • macOS Catalina 10.15.7安装graphviz库
    参考:https://zhuanlan.zhihu.com/p/526601310说明:我通过参考链接里的【方法2:通过软件包管理工具MacPorts,进行间接安装graphviz库】,安装成功pipinstallgraphviz,这样安装的graphviz只是graphviz的调用接口,而并非graphviz程序;graphviz程序,通过sudoportinstallgraphviz在本......
  • Graph Masked Autoencoder for Sequential Recommendation
    目录概符号说明MAERecLearningtoMaskTransitionPathMaskingTask-AdaptiveAugmentation模型代码YeY.,XiaL.andHuangC.Graphmaskedautoencoderforsequentialrecommendation.SIGIR,2023.概图+MAE.符号说明\(\mathcal{U},\mathcal{V}\),users,items;......
  • Codeforces 1835F - Good Graph
    goodproblem,badround。判断YES还是NO很trivial,就直接跑最大匹配看看是不是\(n\)即可。如果是NO,那么考虑Hall定理的证明过程构造即可。具体方法就是找到左部任意一非匹配点,在残量网络上BFS可以到达的点,那所有可以到达的左部点形成的集合就是符合要求的反例。因为你......
  • F5导出wideip的详细信息,cli脚本
    https://community.f5.com/t5/codeshare/export-gtm-dns-configuration-in-csv-tmsh-cli-script/tac-p/292969#M4969导出GTM的wideip:1、tmshlistgtmwideipone-line|awk'{print$0"\n"}'>/var/tmp/wideip.txt2、tmshlistgtmwideip|awk......
  • 使用MaskableGraphic画线段-生成Mesh方式
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;usingUnityEngine.EventSystems;publicclassUGUIPoplateMesh:MaskableGraphic,IPointerEnterHandler,IPointerExitHandler{protectedoverridevoidO......
  • lilo java 快速 graphql stitching 包
    lilo是一个快速的graphqlstitching包,可以实现合并多个graphql服务的合并(schema,以及调用)比较适合的业务场景是gateway说明同时在springone官方中也有介绍到,内部使用到了graphql-java进行处理参考资料https://github.com/friatech/lilohttps://bitbucket.org/atlassian/graphql......
  • .NET中SQL数据库的GraphQL API
    您可能已经阅读了大量关于GraphQL的文章,并且已经了解了这种API技术的所有优缺点,作为RESTAPI的替代方案。但是,让我们不久回顾一下GraphQL是什么,它的主要目的,以及我们如何在现实生活中使用它。关于GraphQL的简短信息GraphQL于2015年由Facebook发布,定位为着名的RESTful架构风格的替代......