题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2767

题意:问最少加多少边可以让所有点都相互连通。

题解:如果强连通分量就1个直接输出0,否者输出入度为0的缩点,出度为0的缩点和的最大值

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. const int N = 2e4 + 10;
  6. const int M = 5e4 + 10;
  7. struct Edge {
  8. int v, next;
  9. }edge[M];
  10. int head[N], e;
  11. int Low[N], DFN[N], Belong[N], num[N], Stack[N];
  12. int Index, top, scc;
  13. int In[N], Out[N];
  14. bool Instack[N];
  15. void init() {
  16. memset(head, -1, sizeof(head));
  17. e = 0;
  18. }
  19. void add(int u, int v) {
  20. edge[e].v = v;
  21. edge[e].next = head[u];
  22. head[u] = e++;
  23. }
  24. void Tarjan(int u) {
  25. int v;
  26. Low[u] = DFN[u] = ++Index;
  27. Stack[top++] = u;
  28. Instack[u] = true;
  29. for(int i = head[u]; i != -1; i = edge[i].next) {
  30. v = edge[i].v;
  31. if(!DFN[v]) {
  32. Tarjan(v);
  33. Low[u] = min(Low[u], Low[v]);
  34. } else if(Instack[v]) Low[u] = min(Low[u], DFN[v]);
  35. }
  36. if(Low[u] == DFN[u]) {
  37. scc++;
  38. do {
  39. v = Stack[--top];
  40. Instack[v] = false;
  41. Belong[v] = scc;
  42. num[scc]++;
  43. } while(v != u);
  44. }
  45. }
  46. int main() {
  47. int t;
  48. scanf("%d", &t);
  49. while(t--) {
  50. int n, m;
  51. scanf("%d%d", &n, &m);
  52. init();
  53. for(int i = 0; i < m; i++) {
  54. int s1, s2;
  55. scanf("%d%d", &s1, &s2);
  56. add(s1, s2);
  57. }
  58. memset(DFN, 0, sizeof(DFN));
  59. memset(Instack, false, sizeof(Instack));
  60. memset(Belong, 0, sizeof(Belong));
  61. memset(num, 0, sizeof(num));
  62. memset(In, 0, sizeof(In));
  63. memset(Out, 0, sizeof(Out));
  64. scc = 0, Index = 0, top = 0;
  65. for(int i = 1; i <= n; i++) {
  66. if(!DFN[i]) Tarjan(i);
  67. }
  68. for(int i = 1; i <= n; i++) {
  69. for(int j = head[i]; j != -1; j = edge[j].next) {
  70. int v = edge[j].v;
  71. if(Belong[i] != Belong[v]) {In[Belong[v]]++, Out[Belong[i]]++;}
  72. }
  73. }
  74. int mxin = 0, mxout = 0;
  75. for(int i = 1; i <= scc; i++) {
  76. if(In[i] == 0) mxin++;
  77. if(Out[i] == 0) mxout++;
  78. }
  79. if(scc == 1) printf("0\n");
  80. else printf("%d\n", max(mxin, mxout));
  81. }
  82. return 0;
  83. }

hdu 2767 Proving Equivalences(tarjan缩点)的更多相关文章

  1. hdu 2767 Proving Equivalences 强连通缩点

    给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...

  2. HDU 2767 Proving Equivalences (强联通)

    pid=2767">http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 40 ...

  3. HDU 2767 Proving Equivalences (Tarjan)

    Proving Equivalences Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...

  4. hdu 2767 Proving Equivalences

    Proving Equivalences 题意:输入一个有向图(强连通图就是定义在有向图上的),有n(1 ≤ n ≤ 20000)个节点和m(0 ≤ m ≤ 50000)条有向边:问添加几条边可使图变 ...

  5. HDU 2767 Proving Equivalences(至少增加多少条边使得有向图变成强连通图)

    Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  6. HDU 2767:Proving Equivalences(强连通)

    题意: 一个有向图,问最少加几条边,能让它强连通 方法: 1:tarjan 缩点 2:采用如下构造法: 缩点后的图找到所有头结点和尾结点,那么,可以这么构造:把所有的尾结点连一条边到头结点,就必然可以 ...

  7. HDU 2767 Proving Equivalences(强连通 Tarjan+缩点)

    Consider the following exercise, found in a generic linear algebra textbook. Let A be an n × n matri ...

  8. hdu2767 Proving Equivalences Tarjan缩点

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  9. hdoj 2767 Proving Equivalences【求scc&&缩点】【求最少添加多少条边使这个图成为一个scc】

    Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

随机推荐

  1. 多线程编程(Linux C)

    多线程编程可以说每个程序员的基本功,同时也是开发中的难点之一,本文以Linux C为例,讲述了线程的创建及常用的几种线程同步的方式,最后对多线程编程进行了总结与思考并给出代码示例. 一.创建线程 多线 ...

  2. 有容云-PPT | 当微服务遇见容器

    编者注: 本文为10月29日有容云高级技术顾问龙淼在Docker Live时代线下系列-广州站中演讲的PPT,本次线下沙龙为有容云倾力打造Docker Live时代系列主题线下沙龙,每月一期畅聊容器技 ...

  3. 最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)

    前言: 最近开发了Zuul网关的实现和Spring Cloud Gateway实现,对比Spring Cloud Gateway发现后者性能好支持场景也丰富.在高并发或者复杂的分布式下,后者限流和自定 ...

  4. 48.QT-网络通信讲解1

    网络概念 MAC地址(硬件地址) 网络IP地址(如192.168.1.101) 网络端口(实现多路通信,用来给不同应用程序来区分使用,范围0~65535,比如浏览网页服务(80端口), FTP服务(2 ...

  5. Educational Codeforces Round 70 (Rated for Div. 2)

    这次真的好难...... 我这个绿名蒟蒻真的要崩溃了555... 我第二题就不会写...... 暴力搜索MLE得飞起. 好像用到最短路?然而我并没有学过,看来这个知识点又要学. 后面的题目赛中都没看, ...

  6. Linux curl 命令详解

    命令概要 该命令设计用于在没有用户交互的情况下工作. curl 是一个工具,用于传输来自服务器或者到服务器的数据.「向服务器传输数据或者获取来自服务器的数据」 可支持的协议有(DICT.FILE.FT ...

  7. MySQL一键生成实体文件的神器-ginbro

    Java转过来的同学对Mybatis的使用肯定不陌生,特别是对一堆表去生成相应的dao和entity的时候使用Mybatis generator所带来的感触,无比深刻.前面我们也讲过原生的数据库使用, ...

  8. 前后端分离后台api接口框架探索

    前言 很久没写文章了,今天有时间,把自己一直以来想说的,写出来,算是一种总结吧!  这篇文章主要说前后端分离模式下(也包括app开发),自己对后台框架和与前端交互的一些理解和看法.     前后端分离 ...

  9. oracle常规使用(一)

    目录 特殊sql distinct 项目中遇到表中无主键,但是某个字段不能重复. 需要匹配id串里的内容 批量更新,但是批量成功返回的是-1 时间格式化 行列互转 应用场景 列转行 总结 oracle ...

  10. Java学习|HTTP请求头

    https://www.cnblogs.com/honghong87/articles/6941436.html 常见http请求报文头属性      Accept:告诉服务端,客户端接受什么类型的响 ...