题意:

一个有向图,问最少加几条边,能让它强连通

方法:

1:tarjan 缩点

2:采用如下构造法:

缩点后的图找到所有头结点和尾结点,那么,可以这么构造:把所有的尾结点连一条边到头结点,就必然可以是强连通了。如果说有几个结点不连通,那么让他们的尾结点相互只向对方的头结点就好了。

那么,最后的答案就是,头结点和尾结点中比较小的那个数量。

当然,如果缩点后只有一个点,那么就是0;

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6. #define N 20010
  7. using namespace std;
  8. vector <int> to[N];
  9. vector <int> g[N];
  10. int in[N], out[N];
  11. //#define vii vector<int>iterator;
  12. int low[N], dep[N], id[N], s[N], top, scnt, cnt;
  13. int n, m;
  14. void tarinit() {
  15. top = cnt = scnt = ;
  16. memset(dep, -, sizeof(dep));
  17. }
  18.  
  19. void tarjan(int u) {
  20. int minc = low[u] = dep[u] = cnt++;
  21. s[top++] = u;
  22. int end = to[u].size();
  23. for (int i = ; i < end; i++) {
  24. if (dep[to[u][i]] == -) tarjan(to[u][i]);
  25. if (minc > low[to[u][i]]) minc = low[to[u][i]];
  26. }
  27. if (minc < low[u]) low[u] = minc;
  28. else {
  29. while (s[top] != u){
  30. id[s[--top]] = scnt;
  31. low[s[top]] = n+;
  32. }
  33. scnt++;
  34. }
  35. }
  36.  
  37. int main() {
  38. int t;
  39. scanf("%d", &t);
  40. while (t--) {
  41. scanf("%d%d", &n, &m);
  42. for (int i = ; i <= n; i++) to[i].clear(), g[i].clear();
  43. for (int i = ; i < m; i++) {
  44. int u, v;
  45. scanf("%d%d", &u, &v);
  46. to[u].push_back(v);
  47. }
  48. tarinit();
  49. for (int i = ; i <= n; i++) {
  50. if (dep[i] == -) {
  51. tarjan(i);
  52. }
  53. }
  54. memset(out,,sizeof(out));
  55. memset(in,,sizeof(in));
  56. for (int i = ; i <= n; i++) {
  57. int end = to[i].size();
  58. for (int j = ; j < end; j++) {
  59. if (id[i] != id[to[i][j]]) {
  60. out[id[i]]++;
  61. in[id[to[i][j]]]++;
  62. }
  63. }
  64. }
  65. if (scnt == ) {
  66. puts("");
  67. continue;
  68. }
  69. int root = ;
  70. int leaf = ;
  71. for (int i = ; i < scnt; i++) {
  72. if (out[i] == ) leaf++;
  73. if (in[i] == ) root++;
  74. }
  75. printf("%d\n", max(root,leaf));
  76. }
  77. return ;
  78. }

HDU 2767:Proving Equivalences(强连通)的更多相关文章

  1. hdu 2767 Proving Equivalences 强连通缩点

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

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

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

  3. HDU 2767 Proving Equivalences (强联通)

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

  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 (Tarjan)

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

  7. hdu - 2667 Proving Equivalences(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=2767 求至少添加多少条边才能变成强连通分量.统计入度为0的点和出度为0的点,取最大值即可. #include & ...

  8. hdu 2767 Proving Equivalences(tarjan缩点)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2767 题意:问最少加多少边可以让所有点都相互连通. 题解:如果强连通分量就1个直接输出0,否者输出入度 ...

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

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

随机推荐

  1. NOIP2013 乌龟棋

    描述 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点 ...

  2. 【上下界网络流 费用流】bzoj2055: 80人环游世界

    EK费用流居然写错了…… Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个80人的团 ...

  3. 【Python学习之六】高阶函数2(map、reduce、filter、sorted)

    3.filter filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素.相当于一 ...

  4. read design into DC memory

  5. TB平台搭建之一

    最近在搭建公司的testbench,主要有一下总结: 1.TB主要有两部分:部分一,软件部分主要用C写的,她的作用是写硬件的驱动(其实就是让核的外围设备可以正常工作或工作到特定的环境上)甚至有可能写整 ...

  6. java上传附件,批量下载附件(一)

    上传附件代码:借助commons-fileupload-1.2.jar package com.str; import java.io.BufferedInputStream;import java. ...

  7. python-数据类型总结 (面试常问)

    目录 数字类型总结 拷贝 浅拷贝 深拷贝 数字类型总结 一个值 多个值 整型/浮点型/字符串 列表/字典/元祖/集合 有序 无序 字符串/列表/元祖 字典/集合 可变 不可变 列表/字典/集合 整型/ ...

  8. python中文件操作的其他方法

    前面介绍过Python中文件操作的一般方法,包括打开,写入,关闭.本文中介绍下python中关于文件操作的其他比较常用的一些方法. 首先创建一个文件poems: p=open('poems','r', ...

  9. SPOJ FFT TSUM

    第一道FFT的题目. 在网上找了很多FFT的资料,但一直都看不懂,最后是看算法导论学的FFT,算法导论上面写的很详细,每一步推导过程都有严格的证明. 下面说这道题 题意: 给一个序列s,有n个不互相同 ...

  10. LOFTER 迁移

    title: LOFTER 迁移 date: 2018-09-01 16:41:02 updated: tags: [其他] description: keywords: comments: imag ...