题目链接

题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的

分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG。接下来,设有a个节点(每个节点对应一个强连通分量)的入度为0,b个节点的出度为0,然后取ab最大的就行了

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5. #include <stack>
  6. #include <algorithm>
  7. using namespace std;
  8. const int Max = + ;
  9. vector<int> g[Max];
  10. int low[Max], dfn[Max];
  11. stack<int> st;
  12. int scc_cnt, dfs_clock, sccno[Max]; //scc_cnt强连通分量个数,sccno[x]表示x属于第几个强连通分量
  13. int in0[Max], out0[Max];
  14. int n, m;
  15. int Min(int x, int y)
  16. {
  17. return x > y ? y : x;
  18. }
  19. void init()
  20. {
  21. for(int i = ; i <= n; i++)
  22. g[i].clear();
  23. memset(low, , sizeof(low));
  24. memset(dfn, , sizeof(dfn));
  25. memset(sccno, , sizeof(sccno));
  26. while(!st.empty())
  27. st.pop();
  28. dfs_clock = scc_cnt = ;
  29. }
  30. void input()
  31. {
  32. int u, v;
  33. scanf("%d%d", &n, &m);
  34. for(int i = ; i < m; i++)
  35. {
  36. scanf("%d%d", &u, &v);
  37. g[u].push_back(v);
  38. }
  39. }
  40. void dfs(int u)
  41. {
  42. low[u] = dfn[u] = ++dfs_clock;
  43. st.push(u);
  44. int len = g[u].size();
  45. for(int i = ; i < len; i++)
  46. {
  47. int v = g[u][i];
  48. if(!dfn[v])
  49. {
  50. dfs(v);
  51. low[u] = Min(low[u], low[v]);
  52. }
  53. else if(!sccno[v])
  54. {
  55. low[u] = Min(low[u], dfn[v]);
  56. }
  57. }
  58. //构成一个环就成了强连通分量了
  59. if(low[u] == dfn[u])
  60. {
  61. scc_cnt++;
  62. while(!st.empty())
  63. {
  64. int x = st.top();
  65. st.pop();
  66. sccno[x] = scc_cnt;
  67. if(x == u)
  68. break;
  69. }
  70. }
  71. }
  72. void solve()
  73. {
  74. for(int i = ; i <= n; i++)
  75. {
  76. if(!dfn[i])
  77. dfs(i);
  78. }
  79. memset(in0, , sizeof(in0));
  80. memset(out0, , sizeof(out0));
  81. for(int i = ; i <= n; i++)
  82. {
  83. int len = g[i].size();
  84. for(int j = ; j < len; j++)
  85. {
  86. int v = g[i][j];
  87. if(sccno[i] != sccno[v])
  88. {
  89. out0[sccno[i]]++;
  90. in0[sccno[v]]++;
  91. }
  92. }
  93. }
  94. int a = , b = ;
  95. for(int i = ; i <= scc_cnt; i++)
  96. {
  97. if(!in0[i])
  98. a++;
  99. if(!out0[i])
  100. b++;
  101. }
  102. int ans = max(a, b);;
  103. if(scc_cnt == ) //如果本身就是连通的输出0
  104. ans = ;
  105. printf("%d\n", ans);
  106. }
  107. int main(int argc, char** argv)
  108. {
  109. int t;
  110. scanf("%d", &t);
  111. while(t--)
  112. {
  113. init();
  114. input();
  115. solve();
  116. }
  117. return ;
  118. }

HD2767Proving Equivalences(有向图强连通分量+缩点)的更多相关文章

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

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

  2. Tarjan算法求有向图强连通分量并缩点

    // Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #inc ...

  3. POJ1236Network of Schools[强连通分量|缩点]

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16571   Accepted: 65 ...

  4. POJ1236Network of Schools(强连通分量 + 缩点)

    题目链接Network of Schools 参考斌神博客 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后 ...

  5. UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)

    题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...

  6. ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)

    题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...

  7. POJ2553 The Bottom of a Graph(强连通分量+缩点)

    题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: #include<cstdio&g ...

  8. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  9. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

随机推荐

  1. 你是否还在质疑EF的性能

    1. 写在前面的话 一直没有写博客的习惯,感觉太浪费时间,没有那么多精力,其实仔细一想,写博客是一种习惯,也是一种心境,同时也是对自己所掌握的知识结构的一个梳理过程,对自己知识体系的一个巩固,同时也是 ...

  2. Hadoop2.6.0伪分布环境搭建

    用到的软件: 一.安装jdk: 1.要安装的jdk,我把它拷在了共享文件夹里面.   (用优盘拷也可以) 2.我把jdk拷在了用户文件夹下面. (其他地方也可以,不过路径要相应改变) 3.执行复制安装 ...

  3. android之视频播放

    视频播放和音频播放一样,都是使用MediaPlayer来播放的,区别就是MediaPlayer播放视频时是直接在Activity中实现的,而音频播放则需要写到服务中去.使用MediaPlayer只支持 ...

  4. JSON字符串——后台解析系列

    以前我们都是讲JSON字符串获取后,在前台进行展示.今天小编就交给大家后台解析展示数据的方法.非常方便,就以下代码: JObject obj = JObject.Parse(data); string ...

  5. scrollHeight,scrollLeft,offsetHeight,offsetLeft

    scrollHeight:内部元素的绝对高度,包含内部元素的隐藏的部分scrollWidth:内部元素的绝对宽度,包含内部元素的隐藏的部分 scrollLeft:设置或获取位于对象左边界和窗口中目前可 ...

  6. Putty SSH简单使用

    本地的puttygen生出的秘钥,公钥传到服务器上连接会报错 Server refused our key. 一般我们建议都在服务器上生成秘钥,把私钥下载下来.加载到putty认证中 01.在服务器上 ...

  7. DatePicker及其监听

    xml文件: <DatePicker android:id="@+id/datep" android:layout_width="wrap_content" ...

  8. 如何调试js文件

    来源于:http://stackoverflow.com/questions/988363/how-can-i-debug-my-javascript-code http://stackoverflo ...

  9. [转]Eclipse工具使用技巧总结

    首先推荐一篇非常好的How to use eclipse文章 ,讲的是eclipse使用的方方面面,非常实用,推荐给大家! 一.常用快捷键:Ctrl+F11 运行Ctrl+Shift+/ 在代码窗口中 ...

  10. 小tip:纯CSS让overflow:auto页面滚动条出现时不跳动

    本文转载于张鑫旭博客,原文地址:http://www.zhangxinxu.com/wordpress/?p=4552 一.水平居中布局与滚动条跳动的千年难题 当前web届,绝大多数的页面间布局都是水 ...