把证明的关系看出一张图,最终就是要所有的点都在至少一个环中。环的判断和度数有关。

用tarjan找强连通分量,在一个强连通分量点已经等价缩点以后形成一个DAG,计算入度为0的点数a,

出度为0的b,取其中大的一个。特判强连通分量数为1的情况。

看懂tarjan算法以后还是比较简单的

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 2e4+;
  4. const int maxm = 5e4+;
  5.  
  6. int head[maxn],nxt[maxm],to[maxm],ecnt;
  7. void addEdge(int u,int v)
  8. {
  9. nxt[ecnt] = head[u];
  10. to[ecnt] = v;
  11. head[u] = ecnt++;
  12. }
  13.  
  14. void initGraph(int n)
  15. {
  16. memset(head,-,sizeof(int)*(n+)); ecnt = ;
  17. }
  18.  
  19. int sccno[maxn],pre[maxn],low[maxn],dfs_clock,scc_cnt;
  20. stack<int> stk;
  21.  
  22. void tarjan(int u)
  23. {
  24. pre[u] = low[u] = ++dfs_clock;
  25. stk.push(u);
  26. for(int i = head[u]; ~i; i = nxt[i]){
  27. int v = to[i];
  28. if(!pre[v]){
  29. tarjan(v);
  30. low[u] = min(low[u],low[v]);
  31. }else if(!sccno[v]){
  32. low[u] = min(low[u],pre[v]);
  33. }
  34. }
  35. if(low[u] == pre[u]){
  36. scc_cnt++;
  37. while(stk.size()){
  38. int x = stk.top(); stk.pop();
  39. sccno[x] = scc_cnt;
  40. if(x == u) break;
  41. }
  42. }
  43. }
  44.  
  45. void find_scc(int n)
  46. {
  47. memset(pre,,sizeof(int)*(n+));
  48. memset(sccno,,sizeof(int)*(n+));
  49. scc_cnt = dfs_clock = ;
  50. for(int i = ; i < n; i++){
  51. if(!pre[i]) tarjan(i);
  52. }
  53. }
  54.  
  55. int ind[maxn],outd[maxn];
  56.  
  57. int main()
  58. {
  59. //freopen("in.txt","r",stdin);
  60. int T; scanf("%d",&T);
  61. while(T--){
  62. int n,m; scanf("%d%d",&n,&m);
  63. initGraph(n);
  64. for(int i = ; i < m; i++){
  65. int u,v; scanf("%d%d",&u,&v);
  66. addEdge(u-,v-);
  67. }
  68. find_scc(n);
  69. if(scc_cnt == ) {
  70. printf("0\n"); continue;
  71. }
  72. for(int i = ; i <= scc_cnt; i++) ind[i] = outd[i] = ;
  73. for(int u = ; u < n; u++){
  74. for(int i = head[u]; ~i; i = nxt[i]){
  75. int v = to[i];
  76. if(sccno[u] != sccno[v]) outd[sccno[u]]++,ind[sccno[v]]++;
  77. }
  78. }
  79. int a = ,b = ;
  80. for(int i = ; i <= scc_cnt; i++){
  81. if(!outd[i]) b++;
  82. if(!ind[i]) a++;
  83. }
  84. printf("%d\n",max(a,b));
  85. }
  86. return ;
  87. }

UVALive 4287 Proving Equivalence (强连通分量)的更多相关文章

  1. UvaLive 4287 Proving Equivalences 强连通缩点

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

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

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

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

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

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

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

  5. UVALive - 4287 Proving Equivalences

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

  6. UVALive 4287 Proving Equivalences(缩点)

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

  7. Proving Equivalences UVALive - 4287(强连通分量 水题)

    就是统计入度为0 的点 和 出度为0 的点  输出 大的那一个,, 若图中只有一个强连通分量 则输出0即可 和https://www.cnblogs.com/WTSRUVF/p/9301096.htm ...

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

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

  9. UVALive 4287 SCC-Tarjan 加边变成强连通分量

    还是强连通分量的题目,但是这个题目不同的在于,问你最少要添加多少条有向边,使得整个图变成一个强连通分量 然后结论是,找到那些入度为0的点的数目 和 出度为0的点的数目,取其最大值即可,怎么证明嘛... ...

随机推荐

  1. PHP实用小程序(六)

    <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio ...

  2. 天天连萌UE分析

    1.开始游戏消耗心,有消耗动画,[可以使用到副本次数上] 2.关卡结束,是个可爱的动画,[可以是潇洒的动画,一个吹箫的潇洒老翁或者帅哥] 3.点击爽快感:点击配对成功飘字及时且快速,[字体漂亮--潇洒 ...

  3. 网络编程-http连接-GET&POST

    GetRequest package com.net.http; import java.io.BufferedReader; import java.io.IOException; import j ...

  4. 简单安装与使用composer

    1.下载composer.exe工具,然后进行安装 这一步需要找到你使用的php版本文件 2.windows+r     cmd  输入composer 安装中国镜像,提高使用效率 https://p ...

  5. hdu1847(sg函数&yy)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1847 题意:中文题诶- 思路:直接sg函数打表即可,观察打表的结果发现是有规律的,sg函数的值只为0, ...

  6. subsets(2018.10.16)

    一句话题意:给你一个包含n个元素的集合,问有多少个非空子集,能划分成和相等的两份.(n<=20) 题解:对于这道题,我们很轻易可以列出\(O(3^n)\)的暴力,这是显然过不了的,观察这道题的性 ...

  7. D. Merge Equals(from Educational Codeforces Round 42 (Rated for Div. 2))

    模拟题,运用强大的stl. #include <iostream> #include <map> #include <algorithm> #include < ...

  8. stringstream转换

    在这之前,在杭电刷题的时候,并没有注意到这个好东西. 使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高 ...

  9. 关于maven项目导入后缺jar包问题的处理方法

    1.maven项目的好处:方便,我们在把自己写好的代码发送给目标人物时可以精简代码——把target目录,一些设置目录之类的都删除掉,接下来要做的就是尽可能的只留下一个src文件夹及pom.xml文件 ...

  10. FMDB存储模型对象(以二进制存储)用NSKeyedArchiver archivedDataWithRootObject序列号,NSKeyedUnarchiver unarchiveObjectWithData反序列化(重点坑是sql语句@"insert into t_newsWithChannel (nwesName,newsType) values (?,?)")一定要用占位符

    交友:微信号 dwjluck2013 一.封装FMDB单例 (1)JLFMDBHelp.h文件 #import <Foundation/Foundation.h> #import < ...