博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Equivalent Sets HDU - 3836 2011多校I tarjan强连通分量
阅读量:5216 次
发布时间:2019-06-14

本文共 1073 字,大约阅读时间需要 3 分钟。

题意:

  给一些集合 要求证明所有集合是相同的

  证明方法是,如果$A∈B$,$B∈A$那么$A=B$成立

  每一次证明可以得出一个$X∈Y$

  现在已经证明一些$A∈B$成立

  求,最少再证明多少次,就可以完成要求

分析

  其实就等价于给一个有向图,问你再加入多少个边可以使得图变为强连通图

  给一个图论经典结论:

  "对于一个有向无环图(DAG),若想让它成为强连通图,至少需要添加$max(a,b)$条边 $a$为入度为0的点的数量,$b$为出度为0的点的数量"

  而对于一个有向图,其每个强连通分量都互相可达,也就是只要到达任意一个点,即可到达内部所有的点

  现在,只要对于强连通分量进行缩点,再新图中统计出入度数即可得到答案

  *注意,如果强连通分量只有1个,答案应该是0而不是1

#include 
#define ll long long#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)#define pp pair
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)#define per(ii,a,b) for(int ii=a;ii>=b;ii--)#define show(x) cout<<#x<<"="<
<
>n>>m){ if(m==0) { cout<
<
>a>>b; add(a,b); } tarjan(); for(int i=1;i<=n;i++){ for(int j=head[i];j;j=e[j].next){ if(belong[i]==belong[e[j].to])continue; dout[belong[i]]++; din[belong[e[j].to]]++; } } int a=0,b=0; for(int i=1;i<=numc;i++){ if(din[i]==0)a++; if(dout[i]==0)b++; } if(numc==1) a=b=0; cout<
<

  

转载于:https://www.cnblogs.com/nervendnig/p/9124280.html

你可能感兴趣的文章
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
3.3.5 查询的参数传递
查看>>
用C#读取相片(JPG图片)的EXIF信息的方法
查看>>
JavaScript 鸭子模型
查看>>
PHP典型功能与Laravel5框架开发学习笔记
查看>>
PInvoke.net Visual Studio Extension
查看>>
帝国CMS (EmpireCMS)
查看>>
Mysql数据库中设置root密码的命令及方法
查看>>
我的第十四篇博客---python进程
查看>>
Xcode ipa打包时无法生成IOS APP ARCHIVE 而生成 Generic Xcode Archive
查看>>
JavaScript中的Map
查看>>
cat 生成文件 运行脚本
查看>>
didReceiveMemoryWarning-内存警告处理方法-iOS
查看>>
设计模式(一)
查看>>
神奇的口袋(dp)
查看>>
怎样使U盘可以COPY超过4G的文件
查看>>
重构第一天:封装集合
查看>>
Gitlab 维护措施
查看>>
Linux下介绍一款不错的HTML编辑器
查看>>