https://vjudge.net/problem/UVALive-4287

题意:

给出n个结点m条边的有向图,要求加尽量少的边,使得新图强连通。

思路:
强连通分量缩点,然后统计缩点后的图的每个结点是否还需要出度和入度。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<sstream>
  6. #include<vector>
  7. #include<stack>
  8. #include<queue>
  9. #include<cmath>
  10. #include<map>
  11. #include<set>
  12. using namespace std;
  13. typedef long long ll;
  14. typedef pair<int,ll> pll;
  15. const int INF = 0x3f3f3f3f;
  16. const int maxn=+;
  17.  
  18. int n, m;
  19. int tot;
  20. int dfs_clock;
  21. int scc_cnt;
  22. int in[maxn];
  23. int out[maxn];
  24. int pre[maxn];
  25. int head[maxn];
  26. int sccno[maxn];
  27. int lowlink[maxn];
  28.  
  29. stack<int> S;
  30.  
  31. struct node
  32. {
  33. int v;
  34. int next;
  35. }e[+];
  36.  
  37. void addEdge(int u, int v)
  38. {
  39. e[tot].v=v;
  40. e[tot].next=head[u];
  41. head[u]=tot++;
  42. }
  43.  
  44. void dfs(int u)
  45. {
  46. pre[u]=lowlink[u]=++dfs_clock;
  47. S.push(u);
  48. for(int i=head[u];i!=-;i=e[i].next)
  49. {
  50. int v=e[i].v;
  51. if(!pre[v])
  52. {
  53. dfs(v);
  54. lowlink[u]=min(lowlink[u],lowlink[v]);
  55. }
  56. else if(!sccno[v])
  57. {
  58. lowlink[u]=min(lowlink[u],pre[v]);
  59. }
  60. }
  61.  
  62. if(lowlink[u]==pre[u])
  63. {
  64. scc_cnt++;
  65. for(;;)
  66. {
  67. int x=S.top();S.pop();
  68. sccno[x]=scc_cnt;
  69. if(x==u) break;
  70. }
  71. }
  72. }
  73.  
  74. void find_scc()
  75. {
  76. dfs_clock=scc_cnt=;
  77. memset(sccno,,sizeof(sccno));
  78. memset(pre,,sizeof(pre));
  79. for(int i=;i<=n;i++)
  80. {
  81. if(!pre[i]) dfs(i);
  82. }
  83. }
  84.  
  85. int main()
  86. {
  87. //freopen("in.txt","r",stdin);
  88. int T;
  89. scanf("%d",&T);
  90. while(T--)
  91. {
  92. scanf("%d%d",&n,&m);
  93. tot=;
  94. memset(head,-,sizeof(head));
  95. while(m--)
  96. {
  97. int u,v;
  98. scanf("%d%d",&u,&v);
  99. addEdge(u,v);
  100. }
  101. find_scc();
  102. for(int i=;i<=scc_cnt;i++) in[i]=out[i]=;
  103. for(int u=;u<=n;u++)
  104. {
  105. for(int i=head[u];i!=-;i=e[i].next)
  106. {
  107. int v=e[i].v;
  108. if(sccno[u]!=sccno[v]) in[sccno[v]]=out[sccno[u]]=; //u,v是桥,所以v不需要入度,u不需要出度
  109. }
  110. }
  111.  
  112. int a=,b=;
  113. for(int i=;i<=scc_cnt;i++)
  114. {
  115. if(in[i]) a++;
  116. if(out[i]) b++;
  117. }
  118. int ans=max(a,b);
  119. if(scc_cnt==) ans=;
  120. printf("%d\n",ans);
  121. }
  122. return ;
  123. }

LA 4287 等价性证明(强连通分量缩点)的更多相关文章

  1. LA 4287 等价性证明

    题目链接:http://vjudge.net/contest/141990#overview 题意是告诉你有n个命题,m条递推关系,表示某个命题可以推出另外一个命题. 现在问你至少在增加多少个递推关系 ...

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

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

  3. LA 4287 有相图的强连通分量

    大白书P322 , 一个有向图在添加至少的边使得整个图变成强连通图, 是计算整个图有a个点没有 入度, b 个点没有出度, 答案为 max(a,b) ; 至今不知所云.(求教) #include &l ...

  4. 训练指南 UVALive - 4287 (强连通分量+缩点)

    layout: post title: 训练指南 UVALive - 4287 (强连通分量+缩点) author: "luowentaoaa" catalog: true mat ...

  5. HDU 3639 Hawk-and-Chicken(强连通分量+缩点)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013480600/article/details/32140501 HDU 3639 Hawk-a ...

  6. 【强连通分量缩点】poj 1236 Network of Schools

    poj.org/problem?id=1236 [题意] 给定一个有向图,求: (1)至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 (2)至少要加多少条边,才能使得从任何一个顶点出发,都 ...

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

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

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

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

  9. HD2767Proving Equivalences(有向图强连通分量+缩点)

    题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...

随机推荐

  1. druid部署

    Quickstart单机测试 http://druid.io/docs/0.10.1/tutorials/quickstart.html (1)Getting started 下载安装Druid: c ...

  2. POJ1789:Truck History(Prim算法)

    http://poj.org/problem?id=1789 Description Advanced Cargo Movement, Ltd. uses trucks of different ty ...

  3. R中基本函数学习[转载]

    转自:https://www.douban.com/note/511740050/ 1.数据管理 numeric:数值型向量 logical:逻辑型向量 character:字符型向量list:列表 ...

  4. [LeetCode] 312. Burst Balloons_hard tag: 区间Dynamic Programming

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...

  5. 摘自(http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html)

    理解Linux系统负荷   作者: 阮一峰 一.查看系统负荷 如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了. 在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行) ...

  6. string.Format字符串格式说明(转)

    转自:http://blog.csdn.net/dl020840504/article/details/8921875   先举几个简单的应用案例: 1.格式化货币(跟系统的环境有关,中文系统默认格式 ...

  7. JSP—中文乱码

    中文乱码问题? --------------------------------------- 不乱码的条件: 1.JSP页面本身的编码 pageEncoding UTF-8 (把jsp页面翻译成ja ...

  8. curl命令总结

    curl常用命令http://www.cnblogs.com/gbyukg/p/3326825.html curl命令后面的网址需要用双引号括起来,原因:防止有特殊字符 &号就是特殊字符 cu ...

  9. JSON语法2

    把 JSON 文本转换为 JavaScript 对象 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 Jav ...

  10. Java求解迷宫问题:栈与回溯算法

    摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1)  选择一个 ...