layout: post

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

author: "luowentaoaa"

catalog: true

mathjax: true

tags:

- 强连通分量

- 图论

- 训练指南


Proving Equivalences

UVALive - 4287

题意

有n个命题,已知其中的m个推导,要证明n个命题全部等价(等价具有传递性),最少还需要做出几次推导。

题解

由已知的推导可以建一张无向图,则问题变成了最少需要增加几条边能使图变成强连通图。找出所有的强连通分量,将每一个连通分量视作一个大节点,则整张图变成了一张DAG。设出度为0的大节点个数为a,入度为0的大节点个数为b,则答案就是max(a,b)。为什么是这样呢?因为要使等价证明前进下去,每个大节点的出度和入度都必须不能是0。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll mod=998244353;
  5. const int maxn=1e6+50;
  6. const ll inf=0x3f3f3f3f3f3f3f3fLL;
  7. vector<int>G[maxn];
  8. int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
  9. stack<int>S;
  10. void dfs(int u){
  11. pre[u]=lowlink[u]=++dfs_clock;
  12. S.push(u);
  13. for(int i=0;i<G[u].size();i++){
  14. int v=G[u][i];
  15. if(!pre[v]){
  16. dfs(v);
  17. lowlink[u]=min(lowlink[u],lowlink[v]);
  18. }
  19. else if(!sccno[v]){
  20. lowlink[u]=min(lowlink[u],pre[v]);
  21. }
  22. }
  23. if(lowlink[u]==pre[u]){
  24. scc_cnt++;
  25. for(;;){
  26. int x=S.top();S.pop();
  27. sccno[x]=scc_cnt;
  28. if(x==u)break;
  29. }
  30. }
  31. }
  32. void find_scc(int n){
  33. dfs_clock=scc_cnt=0;
  34. memset(sccno,0,sizeof(sccno));
  35. memset(pre,0,sizeof(pre));
  36. for(int i=0;i<n;i++)
  37. if(!pre[i])dfs(i);
  38. }
  39. int in[maxn],out[maxn];
  40. int main()
  41. {
  42. std::ios::sync_with_stdio(false);
  43. std::cin.tie(0);
  44. std::cout.tie(0);
  45. int t;
  46. cin>>t;
  47. while(t--){
  48. int n,m;
  49. cin>>n>>m;
  50. for(int i=0;i<=n;i++)G[i].clear();
  51. for(int i=0;i<m;i++){
  52. int u,v;
  53. cin>>u>>v;u--;v--;
  54. G[u].push_back(v);
  55. }
  56. find_scc(n);
  57. for(int i=1;i<=scc_cnt;i++)in[i]=out[i]=1;
  58. for(int u=0;u<n;u++)
  59. for(int i=0;i<G[u].size();i++){
  60. int v=G[u][i];
  61. if(sccno[u]!=sccno[v])in[sccno[v]]=out[sccno[u]]=0;
  62. }
  63. int a=0,b=0;
  64. for(int i=1;i<=scc_cnt;i++){
  65. if(in[i])a++;
  66. if(out[i])b++;
  67. }
  68. if(scc_cnt==1)cout<<0<<endl;
  69. else cout<<max(a,b)<<endl;
  70. }
  71. return 0;
  72. }

训练指南 UVALive - 4287 (强连通分量+缩点)的更多相关文章

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

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

  2. 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)

    layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...

  3. LA 4287 等价性证明(强连通分量缩点)

    https://vjudge.net/problem/UVALive-4287 题意: 给出n个结点m条边的有向图,要求加尽量少的边,使得新图强连通. 思路:强连通分量缩点,然后统计缩点后的图的每个结 ...

  4. 训练指南 UVALive - 5135 (双连通分量)

    layout: post title: 训练指南 UVALive - 5135 (双连通分量) author: "luowentaoaa" catalog: true mathja ...

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

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

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

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

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

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

  8. UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)

    题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...

  9. ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)

    题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...

随机推荐

  1. 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学

    神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...

  2. Codeforces Round #525 (Div. 2) F. Ehab and a weird weight formula

    F. Ehab and a weird weight formula 题目链接:https://codeforces.com/contest/1088/problem/F 题意: 给出一颗点有权值的树 ...

  3. ubuntu安装GraphicsMagick

    一. sudo apt-get install graphicsmagick 二. http://www.cnblogs.com/cocowool/archive/2010/08/16/1800954 ...

  4. itext转html为pdf遇到的问题

    记录一下使用itext将html文件转为pdf文件遇到的一些问题 1.中文不显示 原因:itext默认不支持中文 解决方法:引入中文字体 需要注意的是在java代码中设置好中文字体后,还需要在html ...

  5. lesson 4 再谈继承多态,抽象类和接口

    再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...

  6. 【poj3734】矩阵乘法

    题解: 若当前有i个格子.2个是偶数的方案数为a[i]1个是偶数的方案数为b[i]0个是偶数的方案数为c[i] a[i+1]=2*a[i](i+1染成黄或蓝)+b[i](把奇数变为偶数)b[i+1]= ...

  7. 「6月雅礼集训 2017 Day2」B

    [题目大意] 求n*n的棋盘,每行每列都有2个黑格子的方案数. n<=10^7 [题解] zzq的做法好神奇啊 行列建点,二分图 左边有i个点,右边有j个点的方案数 f[i,j] 左边有i个点, ...

  8. COGS727 [网络流24题] 太空飞行计划

    [问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪 ...

  9. [bzoj4766]文艺计算姬——完全二分图生成树个数

    Brief Description 求\(K_{n,m}\) Algorithm Design 首先我们有(Matrix Tree)定理,可以暴力生成几组答案,发现一些规律: \[K_{n,m} = ...

  10. bzoj 2819 博弈论

    我们可以把 n为偶数的时候,n*n的棋盘看成若干个不相交的2*1的格子,那么对于每个2*1的格子,如果先手选了其中的一个,另一个人都可以选另一个,所以最后使先手没有可以选的格子,先手必败(这里的先手并 ...