题意:给出一个有向图,问最少添加几条有向边使得原图强连通。

解法:求出SCC后缩点,统计一下出度为0的点和入度为0的点,二者取最大值就是答案。

还有个特殊情况就是本身就是强连通的话,答案就是0.

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <stack>
  7. using namespace std;
  8.  
  9. const int maxn = + ;
  10.  
  11. int n, m;
  12.  
  13. vector<int> G[maxn];
  14.  
  15. stack<int> S;
  16. int pre[maxn], low[maxn], sccno[maxn];
  17. int dfs_clock, scc_cnt;
  18.  
  19. void dfs(int u, int fa)
  20. {
  21. low[u] = pre[u] = ++dfs_clock;
  22. S.push(u);
  23.  
  24. for(int i = ; i < G[u].size(); i++)
  25. {
  26. int v = G[u][i];
  27. if(!pre[v])
  28. {
  29. dfs(v, u);
  30. low[u] = min(low[u], low[v]);
  31. }
  32. else if(!sccno[v]) low[u] = min(low[u], pre[v]);
  33. }
  34.  
  35. if(pre[u] == low[u])
  36. {
  37. scc_cnt++;
  38. for(;;)
  39. {
  40. int x = S.top(); S.pop();
  41. sccno[x] = scc_cnt;
  42. if(x == u) break;
  43. }
  44. }
  45. }
  46.  
  47. void find_scc()
  48. {
  49. memset(pre, , sizeof(pre));
  50. memset(sccno, , sizeof(sccno));
  51. dfs_clock = scc_cnt = ;
  52. for(int i = ; i <= n; i++) if(!pre[i]) dfs(i, );
  53. }
  54.  
  55. int in[maxn], out[maxn];
  56.  
  57. int main()
  58. {
  59. int T; scanf("%d", &T);
  60. while(T--)
  61. {
  62. scanf("%d%d", &n, &m);
  63. for(int i = ; i <= n; i++) G[i].clear();
  64. while(m--)
  65. {
  66. int u, v; scanf("%d%d", &u, &v);
  67. G[u].push_back(v);
  68. }
  69.  
  70. find_scc();
  71.  
  72. if(scc_cnt == ) { puts(""); continue; }
  73.  
  74. memset(in, , sizeof(in));
  75. memset(out, , sizeof(out));
  76. for(int i = ; i <= n; i++)
  77. for(int j = ; j < G[i].size(); j++)
  78. {
  79. int u = sccno[i], v = sccno[G[i][j]];
  80. if(u != v) { out[u]++; in[v]++; }
  81. }
  82.  
  83. int hehe = , haha = ;
  84. for(int i = ; i <= scc_cnt; i++)
  85. {
  86. if(!in[i]) hehe++;
  87. if(!out[i]) haha++;
  88. }
  89. printf("%d\n", max(hehe, haha));
  90. }
  91.  
  92. return ;
  93. }

代码君

UVa 12167 & HDU 2767 强连通分量 Proving Equivalences的更多相关文章

  1. HDU 3072 (强连通分量)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3072 题目大意:为一个有向连通图加边.使得整个图全连通,有重边出现. 解题思路: 先用Tarjan把 ...

  2. hdu 4685(强连通分量+二分图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:n个王子和m个公主,王子只能和他喜欢的公主结婚,公主可以和所有的王子结婚,输出所有王子可能 ...

  3. hdu 4685(强连通分量+二分图的完美匹配)

    传送门:Problem 4685 https://www.cnblogs.com/violet-acmer/p/9739990.html 参考资料: [1]:二分图的最大匹配.完美匹配和匈牙利算法 [ ...

  4. hdu 2767 强连通缩点处理加边问题

    #include <cstring> #include <cstdlib> #include <cstdio> 缩点的好处就是可以将乱七八糟的有向图 转化为无环的有 ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=2767 题意:给出n个点m条边,问在m条边的基础上,最小再添加多少条边可以让图变成强连通.思路:强连通分量缩点后找 ...

  6. hdu 2767 Proving Equivalences

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

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

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

  8. HDU 2767 Proving Equivalences (Tarjan)

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

  9. 有向图 加最少的边 成为强连通分量的证明 poj 1236 hdu 2767

    poj 1236: 题目大意:给出一个有向图, 任务一: 求最少的点,使得从这些点出发可以遍历整张图  任务二: 求最少加多少边 使整个图变成一个强连通分量. 首先任务一很好做, 只要缩点 之后 求 ...

随机推荐

  1. 洪水(flood)

    洪水(flood) 题目背景 Awson是某国际学校信竞组的一只菜鸡.今年,该市发生了千年难遇的洪水.被监禁在学校的Awson不甘怠堕,想将自己投入到公益服务事业中去.这天,他偷了H老师的小电驴,偷偷 ...

  2. 基本类型包装类、System类、Math类、Arrays类、大数据运算

    1 基本类型包装类 Java中想对8种基本数据类型进行复杂操作很困难. 实际程序界面上用户输入的数据都是以字符串类型进行存储的. 程序开发中,需要把字符串转换成指定的基本数据类型. 1.1基本数据类型 ...

  3. Garmin APP开发之布局

    上一章节介绍了garmin app开发的入门,包括garmin-sdk,开发工具的安装部署,文章结尾我们新建了我们的第一个app程序Garmin开发-入门: http://tieba.baidu.co ...

  4. 【虚拟机-远程连接】Azure Linux 虚拟机常见导致无法远程的操作

    对Azure虚拟机的一些操作可能会导致无法远程连接,本文罗列了以下导致不能远程连接的场景: 场景1 - 在虚拟机配置IP地址或MAC地址 场景2 - 错误地修改服务的配置文件 场景3 - 误设置防火墙 ...

  5. SQL SEVER数据库重建索引的方法

    一.查询思路 1.想要判断数据库查询缓慢的问题,可以使用如下语句,可以列出查询语句的平均时间,总时间,所用的CPU时间等信息 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  6. 如何修改Ruby的gem源(gem sources)

    Ruby环境下的gem sources地址默认是国外网络地址,所以在使用gem的过程中经常会出现找不到资源的Error.那么如何解决这种Error?方法很简单:要么就多次尝试执行gem命令,要么就修改 ...

  7. java入门第二章——java编程基础

    习题 一.填空题 (p)1.java中的程序代码都必须在一个类中定义,类使用(class)关键字来定义. (p)2.布尔常量即布尔类型的两个值,分别是(true)和(false) (p18)3.jav ...

  8. Mandelbrot图像

      using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication3{    ...

  9. WCFSVC文件的分离

    项目结构图如下: 新建一个实现内容和接口的项目: 接口内部如下: using DataModel; using System; using System.Collections.Generic; us ...

  10. CF Gym 100637G \#TheDress (水)

    题解:读懂题意按照题意模拟... 熟悉了一个库函数,strstr,memcpy #include<cstdio> #include<cstring> int main() { ...