首页 > 其他分享 >the solution of Mining Your Own Business

the solution of Mining Your Own Business

时间:2023-09-25 13:49:25浏览次数:42  
标签:Mining Own 连通 ++ ll cnt solution 割点 dcc

the description of problem

(我看的是 PDF 里面的原题所以这里描述会和题目不一样,但是大意一致)

给定一个未必连通的无向图,问最少在几个点设置出口,可以保证任意一个点坍塌后,工人们仍然可以从出口逃生,同时问设置最少出口的方案数量。

thoughts & solution

我们可以知道每个连通块之间是相互独立的,对于每个连通块间的答案,是互不影响的,所以说每个连通块之间的答案是要靠乘法原理维护。

(下面都用 res 来记录我们需要设置的出口数量,num 来表示我们总共的方案数)

这个时候我们考虑每个连通块:

  1. 如果这个连通块中没有割点,这个时候我们只需要在这个连通块内部随意放置两个出口就可以保证每个点都能到达出口。我们还需要分类讨论:

    • 如果这个连通块内只有一个点,我们的答案就将变成

      \[res++ \]

    • 我们这个时候记录答案就是(记这个连通块内部有 cnt 个点)

      \[res += 2, num *= C_{cnt} ^ {2} \]

  2. 如果这个连通块中只有一个割点,我们需要对它进行一个缩点的操作,这个时候,我们的一个割点会一分为二,分别到它这个割点所连接的两个连通分量中,这个时候我们只需要保证里面有一个出口就行了,方案数则是这个左右两个分量中个自得数量(记为 cnt)

\[res ++, num *= cnt - 1 \]

  1. 如果这个连通块有两个或两个以上得割点,我们这个时候则可以证明它一定能去往别得连通块,所以说不会对结果造成贡献。证明放在后面。

Proof

  1. 如果在割点坍塌,在缩完点之后必定是一棵树,而且我们在每一个之前只有一个割点的连通图里面放置了一个出口,所以,在这棵树的最下面必定会有叶子节点,这个叶子节点就会救活这棵树。

  2. 如果是连接了一个割点的 V-DCC 坍塌某一个点,我们在删除这个坍塌的点之后,我们这个图还是连通的,而且因为这个图上面还有一个割点,我们就可以通过这个割点走向另外一个安全的出口。

  3. 如果是连接了两个割点的 V-DCC 坍塌了某一个点,我们同样可以让这个图里面的点去到其他出口。

综上,证毕

CODE TIME

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll

const ll N = 5e4 + 10, M = 1e5 + 10;

ll n, m;

ll tot, ne[M], e[M], h[N];

ll dfn[N], low[N], timestamp;

ll stk[N], top, dcc_cnt, root;

vector<ll> dcc[N];

bool cut[N];

inline void add(ll a, ll b)
{
    ne[++tot] = h[a], h[a] = tot, e[tot] = b;
}

inline void tarjan(ll u)
{
    dfn[u] = low[u] = ++ timestamp;
    stk[ ++ top] = u;
    
    if(root == u && h[u] == -1)
    {
        dcc_cnt ++, dcc[dcc_cnt].push_back(u);
        return ;
    }

    ll cnt = 0;
    for(rl i=h[u]; ~i; i = ne[i])
    {
        ll v = e[i];
        if(!dfn[v]) 
        {
            tarjan(v), low[u] = min(low[u], low[v]);
            if(dfn[u] <= low[v])
            {
                cnt ++;
                if(u != root || cnt > 1) cut[u] = true;
                ++ dcc_cnt;
                ll ele;
                do {
                    ele = stk[top --];
                    dcc[dcc_cnt].push_back(ele);
                } while(ele != v);
                dcc[dcc_cnt].push_back(u);
            }
        }
        else low[u] = min(low[u], dfn[v]);
    }
}

int main()
{
    ll T = 1;
    while(cin >> m, m)
    {
        for(rl i=1; i <= dcc_cnt; ++ i) dcc[i].clear();
        tot = n = timestamp = top = dcc_cnt = 0;
        memset(h, -1, sizeof h), memset(dfn, 0, sizeof dfn), memset(cut, 0, sizeof cut);
        
        while(m -- )
        {
            ll a, b;
            cin >> a >> b;
            n = max(n, a), n = max(n, b);
            add(a, b), add(b, a);
        }
        
        for(root = 1; root <= n; ++ root)
            if(!dfn[root])
                tarjan(root);
                
        ll res = 0, num = 1;
        
        for(rl i=1; i <= dcc_cnt; ++ i)
        {
            ll cnt = 0;
            for(rl j : dcc[i])
                if(cut[j]) 
                    cnt ++ ;
                
            if(cnt == 0) 
            {
                if(dcc[i].size() > 1) res += 2, num *= dcc[i].size() * (dcc[i].size() - 1) / 2;
                else res ++ ;
            }
            else if(cnt == 1) res ++, num *= dcc[i].size()- 1;
        }
        
        printf("Case %lld: %lld %lld\n", T ++, res, num);
    }
    return 0;
}

标签:Mining,Own,连通,++,ll,cnt,solution,割点,dcc
From: https://www.cnblogs.com/carp-oier/p/17727736.html

相关文章

  • Anaconda-CondaError: Downloaded bytes did not match Content-Length
    遇到如下情况:CondaError:DownloadedbytesdidnotmatchContent-Length,换源!condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/#设置搜索时显......
  • Markdown的一些基础用法
    Markdown学习标题三级标题四级标题字体Hello,word!Hello,word!Hello,word!Hello,word!引用孤独的鲸分割线图片超链接Typora最后一个免费版本-KoiC-博客园(cnblogs.com)学习时搜到的,觉得实用便保留下来不妥,可删列表ABCABC表格名字性别......
  • 修复 GRUB unknown filesystem error
    出现问题的原因是我在安装好双系统后重新给硬盘进行了分区,GRUB的位置发生了变化Rescue部分参考:https://zhuanlan.zhihu.com/p/518428303但我没有办法按照上面的链接的方法进行修复和启动,于是按照这一篇下载了"boot-repair"自动修复,遂解决。......
  • 基于Python + SnowNLP实现一个文本情感分析系统
    当你浏览社交媒体、新闻或任何数字内容时,你有没有想过背后的技术是如何分析和理解这些文本的情感的?有没有想过在数百万条评论、帖子或文章中,如何快速地识别出其中的积极和消极情绪?在这篇文章中,我们将揭示其中的奥秘,并教你如何使用Python和SnowNLP来轻松地实现一个文本情感分析系统......
  • solution-at-abc321-c
    题意将所有每位满足递减的整数排序,问第\(k\)大的是多少,不包括\(0\)。思路我们发现最大的满足要求的整数是\(9876543210\),只有\(1e10\)的大小,\(k\)只有不到\(3000\)的大小,可以从小到大枚举所有的数,从T1粘来判断函数打一个表就解决了。打表程序#include<iostream......
  • Name or service not known异常处理方法总结
    本人用VmWorkStationPro搭建立centos7环境,在配置静态ip后,虚机与物理主机网络连通,但是虚机却无法访问外网,贴个图吧 也就是Nameorservicenotknown这个错误。本人虚拟机网络为桥接,物理主机连接的是家里的wifi。以下是本人解决无法访问外网的步骤:1.cd/etc/sysconfig/networ......
  • 第一天MarkDown学习
    MarkDown学习标题标题#空格+表题名字一级表题两个#加空格二级标题三个#加空格三级标题四个#四级标题最多只有六级标题 字体hello两边加两个**变成粗体hello两边加一个*变成斜体hello三个*斜体加粗hello两边加两个波浪号引用">"加空格分割线“......
  • Ubuntu20.04 ping Temporary failure in name resolution问题
    解决步骤vi/etc/systemd/resolved.conf将DNS的注释取消掉并改成8.8.8.8即可参考:https://blog.csdn.net/weixin_43354181/article/details/105352203......
  • Solution -「HDU」Ridiculous Netizens
    Desc.  给定一棵\(N\)个节点无根树,找出满足以下条件的集合\(S\)的数量:\(S\subseteq\{1,\dots,n\}\);\(S\)的导出子图联通;\(\displaystyle\prod_{v\inS}a_v\leqslantM\)。Sol.  点分治,统计包括当前分治中心的集合数量,如果从子树的角度入手会发现并不好做—......
  • 执行docker compose up -d报错 unknown shorthand flag: 'd' in -d
    执行dockercomposeup-d报错unknownshorthandflag:'d'in-d/usr/libexec/docker/cli-plugins/目录下没有docker-compose或者有docker-compose但执行dockerhelp显示InvalidPlugins:composefailedtofetchmetadata:exitstatus1 实际上是docker-compose未......