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

题意:

给你一个有向图,问你至少需要添加多少条边,使得整个图强连通。

题解:

就。。直接缩点,令缩点后入度为0的点有a个,出度为0的点有b个,答案就是max(a,b)

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<stack>
  6. #define MAX_N 20004
  7. using namespace std;
  8.  
  9. vector<int> G[MAX_N];
  10. int dfn[MAX_N],low[MAX_N],ind;
  11. bool vis[MAX_N];
  12. stack<int> st;
  13. bool inStack[MAX_N];
  14.  
  15. int id[MAX_N],tot=;
  16. vector<int> newG[MAX_N];
  17. vector<int> newrG[MAX_N];
  18.  
  19. int n,m;
  20.  
  21. void init() {
  22. for (int i = ; i <= n; i++) {
  23. G[i].clear();
  24. newG[i].clear();
  25. newrG[i].clear();
  26. }
  27. memset(dfn, , sizeof(dfn));
  28. memset(low, , sizeof(low));
  29. ind = tot = ;
  30. memset(vis, , sizeof(vis));
  31. while (st.size())st.pop();
  32. memset(inStack, , sizeof(inStack));
  33. memset(id, , sizeof(id));
  34. }
  35.  
  36. void Tarjan(int u) {
  37. dfn[u] = low[u] = ++ind;
  38. st.push(u);
  39. inStack[u] = ;
  40. vis[u] = ;
  41. for (int i = ; i < G[u].size(); i++) {
  42. int v = G[u][i];
  43. if (!vis[v]) {
  44. Tarjan(v);
  45. low[u] = min(low[u], low[v]);
  46. }
  47. else if (inStack[v])
  48. low[u] = min(low[u], dfn[v]);
  49. }
  50. if (low[u] == dfn[u]) {
  51. tot++;
  52. int t;
  53. do {
  54. t = st.top();
  55. st.pop();
  56. inStack[t] = ;
  57. id[t] = tot;
  58. } while (t != u);
  59. }
  60. }
  61.  
  62. int main() {
  63. int T;
  64. cin.sync_with_stdio(false);
  65. cin >> T;
  66. while (T--) {
  67. cin >> n >> m;
  68. int ans = ;
  69. init();
  70. for (int i = ; i < m; i++) {
  71. int u, v;
  72. cin >> u >> v;
  73. G[u].push_back(v);
  74. }
  75. for (int i = ; i <= n; i++)
  76. if (!vis[i])Tarjan(i);
  77. for (int u = ; u <= n; u++)
  78. for (int i = ; i < G[u].size(); i++)
  79. if (id[u] != id[G[u][i]]) {
  80. newG[id[u]].push_back(id[G[u][i]]);
  81. newrG[id[G[u][i]]].push_back(id[u]);
  82. }
  83. if (tot == ) {
  84. cout << << endl;
  85. continue;
  86. }
  87. int a = , b = ;
  88. for (int u = ; u <= tot; u++) {
  89. if (newG[u].size() == )a++;
  90. if (newrG[u].size() == )b++;
  91. }
  92. cout << max(a, b) << endl;
  93. }
  94. return ;
  95. }

UvaLive 4287 Proving Equivalences 强连通缩点的更多相关文章

  1. UVALive 4287 Proving Equivalences(缩点)

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

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

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

  3. hdu 2767 Proving Equivalences 强连通缩点

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

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

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

  5. UVALive - 4287 Proving Equivalences

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

  6. UVALive Proving Equivalences (强连通分量,常规)

    题意: 给一个有向图,问添加几条边可以使其强连通. 思路: tarjan算法求强连通分量,然后缩点求各个强连通分量的出入度,答案是max(入度为0的缩点个数,出度为0的缩点个数). #include ...

  7. UVALive 4287 Proving Equivalence (强连通分量)

    把证明的关系看出一张图,最终就是要所有的点都在至少一个环中.环的判断和度数有关. 用tarjan找强连通分量,在一个强连通分量点已经等价缩点以后形成一个DAG,计算入度为0的点数a, 出度为0的b,取 ...

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

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

  9. hdu2767 Proving Equivalences --- 强连通

    给一个图,问至少加入�多少条有向边能够使图变成强连通的. 原图是有环的,缩点建图,在该DAG图上我们能够发现,要使该图变成强连通图必须连成环 而加入�最少的边连成环,就是把图上入度为0和出度为0的点连 ...

随机推荐

  1. leetcode-17-BST

    530. Minimum Absolute Difference in BST Given a binary search tree with non-negative values, find th ...

  2. STM8 EEPROM心得

    对于STM8来说,其内部的EEPROM确实是个不错的东西,而且STM8S103/105价格已经非常便宜了,当然也可以用STM8S003/005代替,而且价格更便宜,大概在,1.2/2.0元左右,比10 ...

  3. LA 7072 Signal Interference 计算几何 圆与多边形的交

    题意: 给出一个\(n\)个点的简单多边形,和两个点\(A, B\)还有一个常数\(k(0.2 \leq k < 0.8)\). 点\(P\)满足\(\left | PB \right | \l ...

  4. joyoi tyvj1313 [NOIP2010初赛]烽火传递

    单调队列优化dp #include <iostream> #include <cstdio> using namespace std; int dp[1000005], n, ...

  5. Selenium 报错:Element is not clickable at point

    WebDriverException: unknown error: Element <td class="grid - select - input " stype=&qu ...

  6. Nginx从入门到放弃-第5章 Nginx架构篇

    5-1 Nginx常见问题_架构篇介绍 5-2 Nginx常见问题_多个server中虚拟主机读取的优先级 5-3 Nginx常见问题_多个location匹配的优先级1 5-4 Nginx常见问题_ ...

  7. aiomysql inserting operation failed !

    emotions: those days,i am using aiomysql(python3.5) to acess my database .But a 'strange' problem ma ...

  8. [python学习篇][书籍学习][python standrad library][内建类型]迭代器类型

    我们已经知道,可以直接作用于for循环的数据类型有以下几种:一类是集合数据类型,如list.tuple.dict.set.str等:一类是generator,包括生成器和带yield的generato ...

  9. 是男人就过 8 题--Pony.AI A AStringGame

    链接:https://www.nowcoder.com/acm/contest/92/A来源:牛客网 AStringGame 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 26214 ...

  10. HLG2179 组合(dfs水水更健康)

    组合 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 57(38 users) Total Accepted: 43(36 users) ...