题意:有n个命题,已知其中的m个推导,要证明n个命题全部等价(等价具有传递性),最少还需要做出几次推导。

思路:由已知的推导可以建一张无向图,则问题变成了最少需要增加几条边能使图变成强连通图。找出所有的强连通分量,将每一个连通分量视作一个大节点,则整张图变成了一张DAG。设出度为0的大节点个数为b,入度为0的大节点个数为a,则答案就是max(a,b)。

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

UVALive-4287 Proving Equivalences 有向图的强连通分量+缩点的更多相关文章

  1. UVALive - 4287 - Proving Equivalences(强连通分量)

    Problem   UVALive - 4287 - Proving Equivalences Time Limit: 3000 mSec Problem Description Input Outp ...

  2. UVALIVE 4287 Proving Equivalences (强连通分量+缩点)

    题意:给定一个图,问至少加入多少条边能够使这个图强连通. 思路:首先求出这个图的强连通分量.然后把每个强连通分量缩成一个点.那么这个图变成了一个DAG,求出全部点的入度和出度,由于强连通图中每个节点的 ...

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

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

  4. UVALive - 4287 Proving Equivalences

    给定n个命题之间的已经证明的关系如 a b表示已经证明蕴含式a→b,要求还需要再作多少次证明使得所有的命题都是等价的.将每个命题看成一个点,已经证明的命题之间连一条边,问题转化为添加多少条单向边使得图 ...

  5. UVALive 4287 SCC-Tarjan 加边变成强连通分量

    还是强连通分量的题目,但是这个题目不同的在于,问你最少要添加多少条有向边,使得整个图变成一个强连通分量 然后结论是,找到那些入度为0的点的数目 和 出度为0的点的数目,取其最大值即可,怎么证明嘛... ...

  6. UvaLive 4287 Proving Equivalences 强连通缩点

    原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  7. UVALive 4287 Proving Equivalences(缩点)

    等价性问题,给出的样例为 a->b的形式,问要实现全部等价(即任意两个可以互相推出),至少要加多少个形如 a->b的条件. 容易想到用强连通缩点,把已经实现等价的子图缩掉,最后剩余DAG. ...

  8. 训练指南 UVALive - 4287 (强连通分量+缩点)

    layout: post title: 训练指南 UVALive - 4287 (强连通分量+缩点) author: "luowentaoaa" catalog: true mat ...

  9. HD2767Proving Equivalences(有向图强连通分量+缩点)

    题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...

随机推荐

  1. LocalContainerEntityManagerFactoryBean

    http://doc.okbase.net/liuyitian/archive/109276.html

  2. CODEVS 1638 修复公路

    题目描述 Description A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄, ...

  3. gradient css

    <!DOCTYPE html> <html> <head> <title></title> <script src="js/ ...

  4. 应该知道的25个非常有用的CSS技巧

    在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼 容性的问题, CSS网页布局,说难,其实很简单.说它容易,往往有很多问题困扰着新 手,在中介绍了非常多的技巧,这些小技巧 ...

  5. Linux中crond服务与crontab用法

    需要写个在Linux下定时更新系统的脚本,man crondtab 不甚详细,现将网络上的介绍列举如下: crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cr ...

  6. LibLinear(SVM包)使用说明之(三)实践

    LibLinear(SVM包)使用说明之(三)实践 LibLinear(SVM包)使用说明之(三)实践 zouxy09@qq.com http://blog.csdn.net/zouxy09 我们在U ...

  7. zepto源码学习-05 ajax

    学习zeptoajax之前需要先脑补下,强烈推荐此文http://www.cnblogs.com/heyuquan/archive/2013/05/13/js-jquery-ajax.html 还有A ...

  8. MongoDB开发应用实战

    http://special.csdn.net/mongodb/ http://www.csdn.net/article/2011-03-21/294271 http://blog.itpub.net ...

  9. Altium Designer完美双屏显示方法演示

    布线时我们往往需要对一些信号线做特别的走线处理,这样需要边布线边对照原理图,在protel99中那是一个很痛苦的事,在Altium Designer中这种情况将变很简单. 硬件要求,笔记本+外接显示器 ...

  10. 延时过程中要加上app.processEvents(),进度条里也要加上这句

    如何让程序等待一段时间QTime t;t.start();while(t.elapsed()<1000);这种死循环也是一种常见错误用法.但改成正确的还是比较简单的: QTime t;t.sta ...