首页 > 其他分享 >[POI2008] BLO-Blockade

[POI2008] BLO-Blockade

时间:2024-11-18 09:19:47浏览次数:1  
标签:POI2008 int 割点 Blockade BLO Size Now NowTo size

算法

手玩样例可以快速得知, 如果第 \(i\) 个点不是割点, 只会导致其他点 (以下设为点集 \(O\) ) 不能到达 \(i\) 点, 不会影响 \(O\) 之间的连通性

那么显然的, 我们进行分类讨论

  • \(i\) 点不是割点
    显然的, 只会造成 \(2(n - 1)\) 的贡献

  • \(i\) 点就是割点
    这种情况稍微复杂, 我们考虑 \(\rm{Tarjan}\) 算法的本质是 \(\rm{dfs}\) , 观察到在 \(\rm{dfs}\) 树中, 割点的不同子树本质上就是分割之后的点集, 令点集的个数为 \(k\) , 第 \(i\) 个点集的大小为 \(size_i\)
    点对的数量为 $ 2(n-1)+\displaystyle\sum_{i=1}^k \sum_{j=1,j\neq i}^{k}size_i \times size_j$

注意点对有序

显然的, 我们只需要 \(\mathcal{O}(n ^ 2)\) 的计算割点, \(\mathcal{O}(n ^ 2)\) 的计算贡献即可

但是最坏情况下, 计算贡献的复杂度将达到 \(n ^ 2\) , 这是不符合预期的

考虑对式子进行化简

容易观察到, \(\displaystyle\sum_{j = 1}^{k} size_j = n - size_i - 1\)

现在的答案式子为

$ 2(n-1)+\displaystyle\sum_{i=1}^k \left[size_i \times (n - size_i - 1)\right]$

代码

第一次做连通分量的题, 加油吧

计算 \(Size\) 属于一种很典的处理

#include <bits/stdc++.h>
#define int long long
const int MAXM = 5e5 + 20;
const int MAXN = 1e5 + 20;

int n, m;

class Graph_Class
{
private:

public:
    struct node
    {
        int to, w;
        int next;
    } Edge[MAXM << 1];
    int Edge_Cnt = 0;
    int head[MAXN];
    void head_init() { for (int i = 0; i <= n; i++) head[i] = -1; }

    void addedge(int u, int v, int w) {
        Edge[++Edge_Cnt].to = v, Edge[Edge_Cnt].w = w;
        Edge[Edge_Cnt].next = head[u];
        head[u] = Edge_Cnt;
    }
} Graph;

class Sol_Class
{
private:
    int low[MAXN], dfn[MAXN], num = 0;
    bool isCut[MAXN]; // 是否为割点
    int Size[MAXN];

    int Ans[MAXN];

    void init() {
        memset(low, 0, sizeof(low));
        memset(dfn, 0, sizeof(dfn));
        memset(isCut, false, sizeof(isCut));
        memset(Size, 0, sizeof(Size));
        memset(Ans, 0, sizeof(Ans));
    }

    void tarjan(int Now, int fa)
    {
        low[Now] = dfn[Now] = ++num;
        int Child_Num = 0;
        Size[Now] = 1;

        int fa_Size = n - 1;
        int LSY = 0;
        bool fa_Cut = true;

        for (int i = Graph.head[Now]; ~i; i = Graph.Edge[i].next)
        {
            int NowTo = Graph.Edge[i].to, NowW = Graph.Edge[i].w;
            /*下降边*/
            if (!dfn[NowTo]) // 没访问过
            {
                Child_Num++;
                tarjan(NowTo, Now);
                Size[Now] += Size[NowTo];
                LSY += Size[NowTo] * (n - Size[NowTo] - 1);
                low[Now] = std::min(low[Now], low[NowTo]);

                /*它被分开 (割点)*/
                if(low[NowTo] >= dfn[Now] && Now != 1) {
                    fa_Size -= Size[NowTo];
                    isCut[Now] = true;
                    Ans[Now] += Size[NowTo] * (n - Size[NowTo] - 1);
                }else fa_Cut = false;
            }
            /*上升边*/
            else if (dfn[NowTo] < dfn[Now] && NowTo != fa) { // 记得特判父亲
                low[Now] = std::min(low[Now], dfn[NowTo]);
            }
        }
        if (Now == 1 && Child_Num >= 2) {
            Ans[Now] = LSY;
        }else if (Now != 1 && isCut[Now]){
            Ans[Now] += fa_Size * (n - fa_Size - 1);
        }

        Ans[Now] += 2 * (n - 1);
    }

public:
    void solve() {
        init();
        tarjan(1, -1);
        for (int i = 1; i <= n; i++) printf("%lld\n", Ans[i]);
    }
} Sol;

signed main()
{
    // freopen("P3469_8.in", "r", stdin);

    scanf("%lld %lld", &n, &m);
    Graph.head_init();
    for (int i = 1; i <= m; i++) {
        int u, v;
        scanf("%lld %lld", &u, &v);
        Graph.addedge(u, v, 0);
        Graph.addedge(v, u, 0);
    }

    Sol.solve();

    return 0; 
}

/*
5 5
1 2
2 3
1 3
3 4
4 5


*/

感冒了, 代码细节比较多, 我不在这里整理

总结

注意结论的严谨性

手推样例有助于理解题意

标签:POI2008,int,割点,Blockade,BLO,Size,Now,NowTo,size
From: https://www.cnblogs.com/YzaCsp/p/18551700

相关文章

  • zblog获取当前页面的标题/链接/ID等属性
    方法:使用全局变量$zbp。在函数内部使用global$zbp;声明。常用属性:当前页面链接:$zbp->currenturl当前页面标题:$zbp->template->GetTags('title')当前页面ID:分类页:$zbp->template->GetTags('category')->ID文章页:$zbp->template->GetTags('article�......
  • MarkText使用教程-cnblog
    MarkText使用教程typora是需要付费的,就算使用破解版的,每次都要点....,可能有的时候不需要还是觉得不好找到开源的MarkText,个人觉得还是非常好用的使用的方法也和typora差不多的,用习惯了就好了下载安装首先我们要登录github,搜索Marktext但基本都会搜索到英文版的,对于......
  • bloompy库的CountingBloomFilter使用说明及示例
    1、使用说明: HelponclassCountingBloomFilterinmodulebloompy:classCountingBloomFilter(BloomFilter) | CountingBloomFilter(error_rate=0.001,element_num=10000,bit_num=None) |  | Methodresolutionorder: |   CountingBloomFilter ......
  • zblogphp判断首页、列表页、内容页、单页、搜索页、tag页的代码
    判断代码示例{if$type=='index'&&$page=='1'}/*判断首页*/{if$type=='category'}/*判断分类页*/{if$type=='article'}/*判断内容页*/{if$type=='page'}/*判断独立页面*/{if$type=='author'}/*判断用户页*......
  • weblogic历史漏洞
    weblogic历史漏洞是什么? weblogic是一个web服务器应用(中间件),和jboss一样都是javaee中间件,只能识别java语言,绝大部分漏洞都是T3反序列化漏洞 常见的中间件还有:Apache,nginx,IIS,tomact,weblogic,jboss等默认端口:7001Web界面:Error404--NotFound控制后台:http://ip:7001/consol......
  • vscode + typora + picgo 搭建高效博客(cnblog)工作流
    vscode+typora+picgo搭建高效博客(cnblog)工作流笔者最初在cnblog上面发了很多随笔(水文),后面感觉广告有点多,并且难于管理文章,于是破罐破摔(不要学我)搭建了自己的博客。后来,我折腾过wordpress、jeklly、githubPages(hexo)和giteePages等等,既放不下cnblog上的流量与互动(......
  • AutoCAD Blockview .net在wpf项目中的问题
    之前使用Blockview是遇到平移的问题,这几天在学习使用CommunityToolkit.MVVM框架来创建用户界面,当创建GsPreviewCtrl控件时会遇到错误,导致整个窗体不能显示,错误信息如下:**************异常文本**************System.InvalidProgramException:公共语言运行时检测到无效的......
  • Excel.Application使用手册(摘自:https://www.cnblogs.com/codingking/p/6484461.html)
    定制模块行为(1)OptionExplicit'强制对模块内所有变量进行声明  OptionPrivateModule'标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示  OptionCompareText'字符串不区分大小写  OptionBase1'指定数组的第一个下标为1(2)OnErrorResumeNe......
  • LBA(Logical Block Addressing,逻辑块寻址)是一种硬盘寻址方式,用于将硬盘中的每个存储块
    LBA(逻辑块寻址)模式简介LBA(LogicalBlockAddressing,逻辑块寻址)是一种硬盘寻址方式,用于将硬盘中的每个存储块映射为一个唯一的逻辑地址。这种寻址方式使得操作系统能够通过逻辑地址而不是物理位置来访问硬盘数据,从而简化了硬盘的管理和数据访问。LBA的背景与作用在硬盘的传统寻......
  • zblog提示“非法访问”是什么原因?zblog提示非法访问的解决办法
    错误原因权限不足:网站文件或目录的权限设置不当。开启了安全增强功能:zblog后台的安全增强模式可能导致某些操作被限制。插件冲突:安装的某些插件可能与系统功能冲突。解决办法设置网站文件的权限:将网站文件和目录的权限设置为777(注意:生产环境不建议使用777权限,仅用于调......