题目链接:http://vjudge.net/contest/141990#overview

题意是告诉你有n个命题,m条递推关系,表示某个命题可以推出另外一个命题。

现在问你至少在增加多少个递推关系可以保证所有命题两两互推。

把命题看成一个结点,推导看成有向边,就是n个结点,m 条有向边,要求添加尽量少的边,使得新图强连通。

首先找出强连通分量,把每个强连通分量缩成一个点,得到DAG。设有 a 个结点入度为 0 ,b 个结点出度为 0 ,max(a,b),就是答案。如下图:

入度为 0 的集合 为 1,出度为 0 的集合 为 2,要加两条红边才能 互相到达(强连通)。

先标记所有强连通图的入度出度 1 ,要是有点相同,标记为 0 ,统计 入度为 1 ,出度为 1 的个数。

如果原图只有一个强连通分量 ans = 0 不需要加边。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int Maxn = + ;
  5. vector<int> G[Maxn];
  6. int pre[Maxn];
  7. int lowlink[Maxn];
  8. int sccno[Maxn];
  9. int dfs_clock;
  10. int scc_cnt;
  11.  
  12. stack<int> S;
  13.  
  14. void dfs(int u)
  15. {
  16. pre[u] = lowlink[u] = ++dfs_clock;
  17. S.push(u);
  18.  
  19. for(int i=; i<G[u].size(); i++)
  20. {
  21. int v = G[u][i];
  22. if(!pre[v])
  23. {
  24. dfs(v);
  25. lowlink[u] = min(lowlink[u],lowlink[v]);
  26. }
  27. else if(!sccno[v])
  28. {
  29. lowlink[u] = min(lowlink[u],pre[v]);
  30. }
  31. }
  32.  
  33. if(lowlink[u]==pre[u])
  34. {
  35. scc_cnt ++;
  36. for(;;)
  37. {
  38. int x = S.top();
  39. S.pop();
  40. sccno[x] = scc_cnt;
  41. if(x==u) break;
  42. }
  43. }
  44.  
  45. }
  46.  
  47. void find_scc(int n)
  48. {
  49. dfs_clock = scc_cnt = ;
  50. memset(sccno,,sizeof(sccno));
  51. memset(pre,,sizeof(pre));
  52.  
  53. for(int i=; i<n; i++)
  54. {
  55. if(!pre[i])
  56. dfs(i);
  57. }
  58.  
  59. }
  60.  
  61. int main()
  62. {
  63. int n,m;
  64. int t;
  65. scanf("%d",&t);
  66. while(t--)
  67. {
  68. scanf("%d%d",&n,&m);
  69. for(int i=; i<n; i++)
  70. G[i].clear();
  71.  
  72. for(int i=; i<m; i++)
  73. {
  74. int u,v;
  75. scanf("%d%d",&u,&v);
  76. u--;
  77. v--;
  78. G[u].push_back(v);
  79. }
  80.  
  81. find_scc(n);
  82.  
  83. int in0[Maxn];
  84. int out0[Maxn];
  85. for(int i=; i<=scc_cnt; i++)
  86. {
  87. in0[i] = ;
  88. out0[i] = ;
  89. }
  90.  
  91. for(int u=; u<n; u++)
  92. {
  93. for(int i=; i<G[u].size(); i++)
  94. {
  95. int v = G[u][i];
  96. if(sccno[u]!=sccno[v])
  97. {
  98. in0[sccno[v]] = ;
  99. out0[sccno[u]] = ;
  100. }
  101. }
  102. }
  103.  
  104. int maxin = ,maxout = ;
  105.  
  106. for(int i=; i<=scc_cnt; i++)
  107. {
  108. if(in0[i]) maxin ++;
  109. if(out0[i]) maxout ++;
  110. }
  111.  
  112. int ans = max(maxin,maxout);
  113.  
  114. if(scc_cnt==)
  115. puts("");
  116. else printf("%d\n",ans);
  117.  
  118. }
  119. return ;
  120. }

LA 4287 等价性证明的更多相关文章

  1. LA 4287 等价性证明(强连通分量缩点)

    https://vjudge.net/problem/UVALive-4287 题意: 给出n个结点m条边的有向图,要求加尽量少的边,使得新图强连通. 思路:强连通分量缩点,然后统计缩点后的图的每个结 ...

  2. 2020-BUAA OO-面向对象设计与构造-HW11中对ageVar采用缓存优化的等价性证明(包括溢出情况)

    HW11中对ageVar采用缓存优化的等价性证明(包括溢出情况) 概要 我们知道,第三次作业里age上限变为2000,而如果缓存年龄的平方和,2000*2000*800 > 2147483647 ...

  3. DFA与NFA的等价性,DFA化简

    等价性 对于每个NFA M存在一个DFA M',使得L(M)=L(M')--------等价性证明,NFA的确定化 假定NFA M=<S, Σ, δ, S 0 , F>,我们对M的状态转换 ...

  4. 【软件构造】第三章第五节 ADT和OOP中的等价性

    第三章第五节 ADT和OOP中的等价性 在很多场景下,需要判定两个对象是否 “相等”,例如:判断某个Collection 中是否包含特定元素. ==和equals()有和区别?如何为自定义 ADT正确 ...

  5. NNs(Neural Networks,神经网络)和Polynomial Regression(多项式回归)等价性之思考,以及深度模型可解释性原理研究与案例

    1. Main Point 0x1:行文框架 第二章:我们会分别介绍NNs神经网络和PR多项式回归各自的定义和应用场景. 第三章:讨论NNs和PR在数学公式上的等价性,NNs和PR是两个等价的理论方法 ...

  6. Java中测试对象的等价性

    Java中用于测试对象的等价性有三个操作符:== , != 和 Equals() 对于基本类型即int,boolean, byte 等等来说,==和 != 比较的是 基本类型的内容,这和c.c++是一 ...

  7. Java中的equals和==的差别 以及Java中等价性和同一性的讨论

    ==对基本数据类型比较的是值,对引用类型比较的是地址 equals()比较的是对象的数据的引用 等价性原理: 自反性    x.equals(x)为true 对称性    x.equals(y) 为t ...

  8. 数据结构 《18》----RMQ 与 LCA 的等价性 (一)

    前言     RMQ: 数组 a0, a1, a2,..., an-1, 中求随意区间 a[i+1], a[i+2], ..., a[i+k] 的最小值     LCA: 求二叉树中两个节点的最低公共 ...

  9. 【转】Eric's并发用户数估算与Little定律的等价性

    转自:http://www.cnblogs.com/hundredsofyears/p/3360305.html 在国内性能测试的领域有一篇几乎被奉为大牛之作的经典文章,一个名叫Eric Man Wo ...

随机推荐

  1. Web安全学习笔记之一

    浏览器基本策略:同源策略 同源策略规定:不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源. 同域与不同域:如http://www.text.com与https://www.text.com ...

  2. FineUi导出时禁用ajax即EnableAjax="false"出现问题的解决方法

    fineui导出时会出现乱码, 在按钮上添加EnableAjax="false"属性禁用ajax就可以正常导出.但如果我在后台代码中直接return 而不进行导出流操作,则前台脚本 ...

  3. 无法分配超出32(XXX)的MINEXTENTS报错的解决方法

    今天在创建新表的时候,遇到该报错:ORA-01659 无法分配超出32(XXX)的MINEXTENTS 解决方法:修改表空间大小. 命令如下: ALTER DATABASE DATAFILE ''D: ...

  4. sql 数据库 初级 个人学习总结(一)

    数据库个人总结(初级)1.增删改查 insert into 表名 values ('条件','条件2') delete from 表名 where 条件 update 表名 set=条件值 where ...

  5. 下载包含src,tgz,zip的文件

    下载哪一个文件? 含src的是源码文件,含tgz和zip的分别是linux和windows系统下jar包(java文件包) asc,md5,sha1是三种加密文件,可用于判断文件是否被修改. Ente ...

  6. 数据结构--树(遍历,红黑,B树)

    平时接触树还比较少,写一篇博文来积累一下树的相关知识. 很早之前在数据结构里面学的树的遍历. 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍 ...

  7. 未找到arm-linux-gcc解决办法

    sudo tar jxvf arm-linux-gcc.4.3.3.tar.bz2 export PATH=$PATH:/usr/local/arm/2.95.3/bin #/usr/local/ar ...

  8. 【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输

    实验指导书及代码包下载: http://pan.baidu.com/s/1gemYjz9 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. 【iCore3 双核心板】例程十七:USB_MSC实验——读/写U盘(大容量存储器)

    实验指导书及代码包下载: http://pan.baidu.com/s/1qXt1L0o iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  10. android NumberPicker 数组越界的坑

    被这个问题耽误了一个多小时... 直接上解决方案,参考红色部分. private void initViews() { wheel = (NumberPicker) findViewById(R.id ...