Description

假如有命题p 一定能推出命题q,则称p 是q 的充分条件,q 是p 的必要条件。
特别的,当p 既是q 的充分条件,又是q 的必要条件时,称p 和q 互为充要条件
现在有n 个命题,其中一些是另一些的充分条件。请问有多少对命题互为充要条件?

Input

第一行三个正整数n,m,分别表示命题数、已知关系数
接下来m 行,每行两个正整数p 和q,表示命题p 是命题q 的充分条件

Output

仅一行,一个整数,表示充要条件的对数

Sample Input

5 5
1 3
3 2
2 1
4 5
5 4

Sample Output

4

样例说明:

4 对充要条件分别是(1, 2)、(2, 3)、(1, 3)、(4, 5)

Data Constraint

对于10% 的数据,n <= 10;m <= 50
对于40% 的数据,n <= 500;m <= 1000
对于另外10% 的数据,数据中保证没有重边且m = n^2
对于100% 的数据,n<= 50000;m <= 600000

Solution

  • 稍加思考可知:若命题p 是命题q 的充分条件,则相当于点p 向点q 连一条有向边。

  • 则构成一个图,形成环表示环中点互为充要条件!

  • 那么问题就转化为求此图中的强连通分量,每次累加上 n∗(n−1)/2n*(n-1)/2 ,即可。

  • 可以用Tarjan算法实现,时间复杂度 O(N)O(N)

Code

#include<cstdio>
using namespace std;
const int N=50001;
int tot,now,top;
long long ans;
int dfn[N],low[N],stack[N];
int first[N],next[N*12],en[N*12];
bool vis[N],bz[N];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
inline int min(int x,int y){return (x<y)?x:y;}
inline void insert(int x,int y)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline void tarjan(int x)
{dfn[x]=low[x]=++now;vis[x]=true;bz[stack[++top]=x]=true;for(int i=first[x];i;i=next[i])if(!vis[en[i]]){tarjan(en[i]);low[x]=min(low[x],low[en[i]]);}elseif(bz[en[i]]) low[x]=min(low[x],dfn[en[i]]);if(dfn[x]==low[x]){long long sum=0;do{sum++;bz[stack[top--]]=false;}while(x!=stack[top+1]);ans+=sum*(sum-1)/2;}
}
int main()
{int n=read(),m=read();for(int i=1;i<=m;i++){int x=read(),y=read();insert(x,y);}for(int i=1;i<=n;i++)if(!vis[i]) tarjan(i);printf("%lld",ans);return 0;
}

JZOJ 3899. 【NOIP2014模拟】逻辑的连通性相关推荐

  1. jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  2. JZOJ 3815. 【NOIP2014模拟9.7】克卜勒

    Description 一闪一闪亮晶晶/好像你的身体/藏在众多孤星之中/还是找得到你/挂在天上放光明/反射我的孤寂/提醒我/我也只是一颗寂寞的星星/oh~/浩瀚的世界里/更迭的人海里/和你互相辉映/而 ...

  3. JZOJ 3809. 【NOIP2014模拟8.25】设备塔

    Description 为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔. 简单的说,这座设备塔是一个漂浮在异空间中的圆柱体,圆柱体两头的圆是计算核心,而侧面则是 传输信息所用的数据通 ...

  4. JZOJ 3775. 【NOIP2014模拟8.15】因子的排列

    Description 一天,小B学习了分解质因数的相关内容.他发现,一个数的质因子可以有许多不同的排列方式,例如20=2*2*5=2*5*2=5*2*2,那么小B认为20的质因子有3种不同的排列方式 ...

  5. JZOJ 3731. 【NOIP2014模拟7.10】庐州月

    Description [引子] 桥上的恋人入对出双 桥边红药叹夜太漫长 月也摇晃人也彷徨 乌蓬里传来了一曲离殇 庐州月光洒在心上 月下的你不复当年模样 太多的伤难诉衷肠 叹一句当时只道是寻常 庐州月 ...

  6. JZOJ 3885. 【长郡NOIP2014模拟10.22】搞笑的代码

    Description 在OI界存在着一位传奇选手--QQ,他总是以风格迥异的搞笑代码受世人围观 某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据 while 序列长度< n do { ...

  7. JZOJ 3886. 【长郡NOIP2014模拟10.22】道路维护

    Description 最近徆多人投诉说C国的道路破损程度太大,以至亍无法通行 C国的政府徆重视这件事,但是最近财政有点紧,丌可能将所有的道路都进行维护,所以他们决定按照下述方案进行维护 将C国抽象成 ...

  8. JZOJ 3813. 【NOIP2014模拟9.7】我要的幸福

    Description 幸福/我要的幸福/渐渐清楚/梦想/理想/幻想/狂想/妄想/我只想坚持每一步/该走的方向/就算一路上/偶尔会沮丧/生活是自己/选择的衣裳/幸福/我要的幸福/没有束缚/幸福/我要的 ...

  9. JZOJ 3822. 【NOIP2014模拟9.9】逆光

    Description Zyh养着n盆太阳花,它们被排在一列直线上.为了简化问题,太阳花的朝向只有向左和向右这两种.Zyh非常喜欢这些花,于是他在每盆花的上方放置了光源. 太阳花和Zyh幸福地生活着, ...

最新文章

  1. 老话题,不要在遍历容器中增删容器数据
  2. Java8读文件仅需一行代码
  3. C语言结构体占用内存总结
  4. 关于LocalBroadcastManager的介绍和优势
  5. CentOS 6 rpm方式安装mysql
  6. VS Code集成SandDance可视化分析数据
  7. 水平分库分表的关键问题及解决思路(转)
  8. 埃博拉病毒和微生物现代战争
  9. [P2396] yyy loves Maths VII
  10. graphpad做折线图_Graphpad Prism搞定折线和曲线图,so easy!
  11. python勒索病毒代码_勒索病毒GandCrab-v5.04完整分析
  12. 现金红包、裂变红包、企业付款
  13. win10下安装matlab r2018a破解版
  14. mysql populate_BeanUtils.populate 的作用
  15. Elasticsearch 7.10 之 Indexing pressure
  16. 虚拟专用网和IPv6路由配置【Cisco】
  17. 联想数字化转型之路:从传统IT到“新IT”
  18. Linux达人养成计划I详细笔记(二)Linux分区与安装
  19. android 热更新 方案,热更新-热更新app开发的两种系统方案!
  20. iphone日历同步pc_如何将共享的Google日历与iPhone同步

热门文章

  1. c++学习笔记之析构函数
  2. DCT C语言 修改了c程序以及matlab的程序
  3. Python学习笔记:基础
  4. 现代谱估计:MTM 谐波分析
  5. 简单算法集锦(程序)
  6. [:zh]<界面编程>任务二 用户注册界面设计[:]2018-01-24
  7. 撒花!PyTorch 官方教程中文版正式上线,激动人心的大好事!
  8. python 中map()和lamda的简单实用
  9. 如何将hive与mysql连接_hive连接mysql配置
  10. 根据录入的计算公式计算_工业铝型材承重计算