//题意:问需要添加几条边使得这张图成为每个点都等价(强连通图)

我们先把图中的强连通分量缩点

可能他本身就是满足条件,那么直接输出0

经过缩点后,就可以把强连通分量看成一个个独立的点,在这张图上搞一个强连通图,我们可以根据强连通的性质,也就是每个点都要有被指向边和出去的边,那么也就是求一下每个点(强连通分量)的入度和出度,把出度==0的点个数加起来,把入度==0的点个数加起来,比一比谁大,输出谁,因为我们可以直接在入度为0和出度为0的两点间加边,所以取大的那个就满足。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<math.h>
  4. #include<queue>
  5. #include<stdlib.h>
  6. #include<string>
  7. #include<string.h>
  8. #include<algorithm>
  9. using namespace std;
  10. typedef long long LL;
  11. #define PI acos(-1.0)
  12. #define N 20010
  13. struct asd{
  14. int to;
  15. int next;
  16. };
  17. asd q[N*3];
  18. int head[N*3];
  19. int tol;
  20. int low[N];
  21. int dfn[N];
  22. int vis[N];
  23. int stap[N];
  24. int in[N];
  25. int kr[N];
  26. int kc[N];
  27. int tp,p;
  28. int cnt;
  29. int n;
  30. void tarjan(int u)
  31. {
  32. dfn[u]=low[u]=++tp;
  33. stap[++p]=u;
  34. vis[u]=1;
  35. for(int i=head[u];i!=-1;i=q[i].next)
  36. {
  37. int k=q[i].to;
  38. if(!dfn[k])
  39. {
  40. tarjan(k);
  41. low[u]=min(low[u],low[k]);
  42. }
  43. else if(vis[k])
  44. {
  45. low[u]=min(low[u],dfn[k]);
  46. }
  47. }
  48. if(dfn[u]==low[u])
  49. {
  50. cnt++;
  51. int temp;
  52. while(1)
  53. {
  54. temp=stap[p];
  55. vis[temp]=0;
  56. in[temp]=cnt;
  57. --p;
  58. if(temp==u)
  59. break;
  60. }
  61. }
  62. }
  63. void soga()
  64. {
  65. if(cnt==1)
  66. {
  67. printf("0\n");
  68. return;
  69. }
  70. int pr,pc;
  71. memset(kr,0,sizeof(kr));
  72. memset(kc,0,sizeof(kc));
  73. for(int i=1;i<=n;i++)
  74. {
  75. for(int k=head[i];k!=-1;k=q[k].next)
  76. {
  77. int v=q[k].to;
  78. if(in[v]!=in[i])
  79. {
  80. kr[in[v]]++;
  81. kc[in[i]]++;
  82. }
  83. }
  84. }
  85. pc=pr=0;
  86. for(int i=1;i<=cnt;i++)
  87. {
  88. if(!kr[i])
  89. {
  90. pr++;
  91. }
  92. if(!kc[i])
  93. {
  94. pc++;
  95. }
  96. }
  97. printf("%d\n",max(pr,pc));
  98. }
  99. void add(int a,int b)
  100. {
  101. q[tol].to=b;
  102. q[tol].next=head[a];
  103. head[a]=tol++;
  104. }
  105. int main()
  106. {
  107. int m;
  108. int T;
  109. scanf("%d",&T);
  110. while(T--)
  111. {
  112. int a,b;
  113. scanf("%d%d",&n,&m);
  114. tol=0;
  115. memset(head,-1,sizeof(head));
  116. for(int i=0;i<m;i++)
  117. {
  118. scanf("%d%d",&a,&b);
  119. add(a,b);
  120. }
  121. cnt=p=tp=0;
  122. memset(dfn,0,sizeof(dfn));
  123. memset(vis,0,sizeof(vis));
  124. memset(in,0,sizeof(in));
  125. for(int i=1;i<=n;i++)
  126. {
  127. if(!dfn[i])
  128. tarjan(i);
  129. }
  130. soga();
  131. }
  132. return 0;
  133. }

hdu2767(图的强连通)的更多相关文章

  1. hdu2767 Proving Equivalences --- 强连通

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

  2. Kosaraju与Tarjan(图的强连通分量)

    Kosaraju 这个算法是用来求解图的强连通分量的,这个是图论的一些知识,前段时间没有学,这几天在补坑... 强连通分量: 有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是相互可到达的,则这些 ...

  3. 图的强连通&双连通

    http://www.cnblogs.com/wenruo/p/4989425.html 强连通 强连通是指一个有向图中任意两点v1.v2间存在v1到v2的路径及v2到v1的路径. dfs遍历一个图, ...

  4. Kosaraju算法解析: 求解图的强连通分量

    Kosaraju算法解析: 求解图的强连通分量 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 定义 连通分量:在无向图中,即为连 ...

  5. Proving Equivalences(缩点+有环图变强连通分量)【tarjian算法】

    Proving Equivalences 题目链接(点击) 参考博客(点击) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768 ...

  6. loj 1210 (求最少的加边数使得图变成强连通)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1210 思路:首先是缩点染色,然后重建并且统计新图中的每个点的入度和出度,于是答案就是m ...

  7. 图的强连通分量-Kosaraju算法

    输入一个有向图,计算每个节点所在强连通分量的编号,输出强连通分量的个数 #include<iostream> #include<cstring> #include<vec ...

  8. 求图的强连通分量--tarjan算法

    一:tarjan算法详解 ◦思想: ◦ ◦做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间 ...

  9. 萌新学习图的强连通(Tarjan算法)笔记

    --主要摘自北京大学暑期课<ACM/ICPC竞赛训练> 在有向图G中,如果任意两个不同顶点相互可达,则称该有向图是强连通的: 有向图G的极大强连通子图称为G的强连通分支: Tarjan算法 ...

随机推荐

  1. Android平台Camera实时滤镜实现方法探讨(十一)--实时美颜滤镜

    上一章完毕了对图片的磨皮处理.经过简单算法流程优化,能够达到非常快的速度.可是不能用于实时美颜.经实验,若採用仅仅处理Y信号的方案.半径极限大约是5-10,超过10则明显感受到卡顿.但对于1920X1 ...

  2. c程序设计语言第一章5

    练习1.20请编写程序d e t a b

  3. Cocos2d-x Vector——vector iterators incompatible

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  4. aop中获取方法的注解

    @Around(value="@annotation(apiLog)") public Object around(ProceedingJoinPoint pjp, ApiLog ...

  5. yum 安装 mysql

    安装 yum -y install mysql-server 开机自启动 chkconfig mysqld on 设置账户密码 启动 service mysqld start -- 进入mysql库 ...

  6. hadoop的一般端口使用

  7. 更多的使用自定义元素(CustomElement)。

    更多的使用自定义元素(CustomElement).

  8. queue_action

    http://www.learn4master.com/programming-language/python/python-queue-for-multithreading

  9. 实用API大全

    有道翻译API http://fanyi.youdao.com/openapi 有道翻译API支持中英互译,同时获得有道翻译结果和有道词典结果(可能没有),返回格式为XML或JSON.   百度翻译A ...

  10. 20170228 METHOD handle_data_changed-

    CALL METHOD er_data_changed->add_protocol_entry   METHOD handle_data_changed. DATA: ls_modi TYPE  ...