这也是道强连通分量的题;

题目要求我们求出最少需要添加多少条边让整个图变成一个强连通分量;

思路很简单,直接缩点,然后找出所有点中有多少出度为0,入度为0的点,最大的那个就是题目所求;

贴代码:

  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<stack>
  6. #define maxn 50005
  7. using namespace std;
  8. vector<int>ve[maxn];
  9. int dfn[maxn],low[maxn],ans,n,m,nncount,b[maxn];
  10. int from[maxn],to[maxn],cntin[maxn],cntout[maxn];
  11. bool instack[maxn];
  12. stack<int>q;
  13.  
  14. void tarjin(int x)
  15. {
  16. dfn[x]=low[x]=++nncount;
  17. instack[x]=;
  18. q.push(x);
  19. int l=ve[x].size();
  20. for(int i=; i<l; i++)
  21. {
  22. int v=ve[x][i];
  23. if(!dfn[v])
  24. {
  25. tarjin(v);
  26. low[x]=min(low[x],low[v]);
  27. }
  28. else if(instack[v])
  29. low[x]=min(low[x],dfn[v]);
  30. }
  31. if(low[x]==dfn[x])
  32. {
  33. ans++;
  34. int v;
  35. do
  36. {
  37. v=q.top();
  38. q.pop();
  39. b[v]=ans;
  40. instack[v]=;
  41. }while(v!=x);
  42. }
  43. }
  44.  
  45. int main()
  46. {
  47. int x,y,t,mm1,mm2;
  48. scanf("%d",&t);
  49. while(t--)
  50. {
  51. memset(cntin,,sizeof cntin);
  52. memset(cntout,,sizeof cntout);
  53. memset(b,,sizeof b);
  54. memset(dfn,,sizeof dfn);
  55. memset(low,,sizeof low);
  56. scanf("%d%d",&n,&m);
  57. for(int i=; i<=n; i++)
  58. {
  59. ve[i].clear();
  60. instack[i]=;
  61. }
  62. while(!q.empty()) q.pop();
  63. for(int i=; i<=m; i++)
  64. {
  65. scanf("%d%d",&x,&y);
  66. ve[x].push_back(y);
  67. from[i]=x,to[i]=y;
  68. }
  69. nncount=ans=mm1=mm2=;
  70. for(int i=; i<=n; i++)
  71. if(!dfn[i]) tarjin(i);
  72. if(ans==){printf("0\n");continue;}
  73. for(int i=;i<=m;i++)
  74. {
  75. x=b[from[i]],y=b[to[i]];
  76. if(x!=y) cntout[x]++,cntin[y]++;
  77. }
  78. for(int i=;i<=ans;i++)
  79. {
  80. if(!cntin[i]) mm1++;
  81. if(!cntout[i]) mm2++;
  82. }
  83. printf("%d\n",max(mm1,mm2));
  84. }
  85. return ;
  86. }

hdu 2767的更多相关文章

  1. 有向图 加最少的边 成为强连通分量的证明 poj 1236 hdu 2767

    poj 1236: 题目大意:给出一个有向图, 任务一: 求最少的点,使得从这些点出发可以遍历整张图  任务二: 求最少加多少边 使整个图变成一个强连通分量. 首先任务一很好做, 只要缩点 之后 求 ...

  2. HDU 2767:Proving Equivalences(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=2767 题意:给出n个点m条边,问在m条边的基础上,最小再添加多少条边可以让图变成强连通.思路:强连通分量缩点后找 ...

  3. HDU 2767 Proving Equivalences (强联通)

    pid=2767">http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 40 ...

  4. hdu 2767 Proving Equivalences(tarjan缩点)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2767 题意:问最少加多少边可以让所有点都相互连通. 题解:如果强连通分量就1个直接输出0,否者输出入度 ...

  5. 强联通 HDU 2767 3836

    n个点m条边 最少需要几条边变成强连通图 设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案. 注意特殊情况: 当原图已经强连通时, 答案是0而不是1. 加一条边少一个入度 ...

  6. hdu 2767 Proving Equivalences

    Proving Equivalences 题意:输入一个有向图(强连通图就是定义在有向图上的),有n(1 ≤ n ≤ 20000)个节点和m(0 ≤ m ≤ 50000)条有向边:问添加几条边可使图变 ...

  7. hdu 2767 Proving Equivalences 强连通缩点

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

  8. HDU 2767 Proving Equivalences(至少增加多少条边使得有向图变成强连通图)

    Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  9. HDU 2767 Proving Equivalences (Tarjan)

    Proving Equivalences Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...

随机推荐

  1. Manually connecting to the Oracle Linux Yum Server

    Manually connecting to the Oracle Linux Yum Server 1. Download and Install Oracle Linux   Note: The ...

  2. datejs lib

    // Get today's date Date.today(); // Add 5 days to today Date.today().add(5).days(); // Get Friday o ...

  3. iOS toolbar

    初学ios,对toolbar初步了解: self.navigationItem.title=@"显示工具栏"; // 显示工具栏 //self.navigationControll ...

  4. 20151214 jquery插件代码备份

    ;(function ($) { //局部性的 /*$.fn.extend({ 'nav' : function (color) { $(this).find('.nav').css({ 'list- ...

  5. #ifndef#define#endif的用法

    在网上看到了感觉作者总结得很好,作者辛苦了! #ifndef#define#endif的用法 文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都 ...

  6. MD5/SHA加密

    public class EncryptUtil { public static String getEncrypt(String value , String encrypt_type){ Stri ...

  7. JavaSE生成随机数

    今天呢,老师讲了一下怎么用jvm实现随机数(本人对此很感兴趣),一个简单的随机100以内整数的代码如下: /** 生成随机数 */ import java.util.Random; public cl ...

  8. javascript 去除字符串中重复字符

    /** * 去除字符串中重复的字符,以下提供2种方法, * removeRepeat()为自己所想: * removeRepeat2()参考网上思路补充的 * removeRepeat3()敬请期待· ...

  9. bzoj4330:JSOI2012 爱之项链

    题目大意:一串项链由n个戒指组成,对于每个戒指,一共有M个点,R种颜色,且旋转后相同的戒指是相同的,然后一串项链又由N个戒指组成,同时要满足相邻的两个戒指不能相同,这串项链上某个位置插入了一个特殊的东 ...

  10. (转)UIButton用法详解一

    (注明 来源网址 http://blog.csdn.net/cheneystudy/article/details/8115092)这段代码动态的创建了一个UIButton,并且把相关常用的属性都列举 ...