思路:先缩点成有向无环图,则必然含有出度为0的点/入度为0的点,因为要使添加的边尽量多,最多最多也就n*(n-1)条减去原来的m条边,这样是一个强连通图,问题转化为最少去掉几条,使图不强连通,原来图中入度的点,若不添加入度,则必然不连通,同理出度为0的也一样,所以,找入度/出度为0的点中, ki(n-ki)最小的,这里KI是缩点后该SCC中的点数量,这个结果就是最小去掉的边数了。

思路清晰,1A。

  1. #include<iostream>
  2. #include<vector>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<stack>
  6. using namespace std;
  7. int n,m;
  8. const int maxv=100030;
  9. vector<vector<int> >edges(maxv);
  10. int visited[maxv]; int low[maxv]; int dfn[maxv];
  11. int ind[maxv]; int outd[maxv]; int sccnum[maxv];
  12. int scc[maxv];
  13. int num;int times;
  14. stack<int>s;
  15. int instack[maxv];
  16. void tarjan(int u)
  17. {
  18. low[u]=dfn[u]=times++;
  19. instack[u]=1;
  20. s.push(u);
  21. int len=edges[u].size();
  22. for(int i=0;i<len;i++)
  23. {
  24. int v=edges[u][i];
  25. if(visited[v]==0)
  26. {
  27. visited[v]=1;
  28. tarjan(v);
  29. if(low[u]>low[v])low[u]=low[v];
  30. }
  31. else if(instack[v]&&low[u]>dfn[v])
  32. {
  33. low[u]=dfn[v];
  34. }
  35. }
  36. if(dfn[u]==low[u]) //在一个SCC
  37. {
  38. num++;int temp;int snum=0;
  39. do
  40. {
  41. snum++;
  42. temp=s.top();
  43. instack[temp]=0;
  44. s.pop();
  45. scc[temp]=num;
  46. } while(temp!=u);
  47. sccnum[num]=snum;
  48. }
  49. }
  50. void readin() //读入数据
  51. {
  52. scanf("%d%d",&n,&m);
  53. int a,b;
  54. for(int i=1;i<=m;i++)
  55. {
  56. scanf("%d%d",&a,&b);
  57. edges[a].push_back(b);
  58. }
  59. }
  60. void initialize()
  61. {
  62. num=times=0;
  63. for(int i=0;i<=100000;i++)
  64. {
  65. dfn[i]=low[i]=ind[i]=outd[i]=visited[i]=sccnum[i]=scc[i]=0;
  66. edges[i].clear();
  67. }
  68. }
  69. int solve()
  70. {
  71. for(int i=1;i<=n;i++)
  72. if(visited[i]==0)
  73. {
  74. visited[i]=1;
  75. tarjan(i);
  76. }
  77. if(num==1){return -1;}
  78. for(int i=1;i<=n;i++)
  79. {
  80. int len=edges[i].size();
  81. for(int j=0;j<len;j++)
  82. {
  83. int v=edges[i][j];
  84. if(scc[v]!=scc[i])
  85. {
  86. outd[scc[i]]++;
  87. ind[scc[v]]++;
  88. }
  89. }
  90. }
  91. int mincut=1000000000;
  92. for(int i=1;i<=num;i++)
  93. {
  94. int temp=0;
  95. if(outd[i]==0||ind[i]==0)
  96. {
  97. temp=sccnum[i]*(n-sccnum[i]);
  98. if(temp<mincut)mincut=temp;
  99. }
  100. }
  101. return n*(n-1)-m-mincut;
  102. }
  103. int main()
  104. {
  105. int T;
  106. cin>>T;int cases=1;
  107. while(T--)
  108. {
  109. initialize();
  110. readin();
  111. int ans=solve();
  112. printf("Case %d: %d\n",cases++,ans);
  113. }
  114. return 0;
  115. }

hdu4635 有向图最多添加多少边使图仍非强连通的更多相关文章

  1. poj 3177 Redundant Paths【求最少添加多少条边可以使图变成双连通图】【缩点后求入度为1的点个数】

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11047   Accepted: 4725 ...

  2. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

  3. Strongly connected HDU - 4635 原图中在保证它不是强连通图最多添加几条边

    1 //题意: 2 //给你一个有向图,如果这个图是一个强连通图那就直接输出-1 3 //否则,你就要找出来你最多能添加多少条边,在保证添加边之后的图依然不是一个强连通图的前提下 4 //然后输出你最 ...

  4. Android -- FragmentActivity添加Fragment的序列图

    FragmentActivity添加Fragment的序列图

  5. Android 如何添加一个apk使模拟器和真机都编译进去 m

    添加一个apk都需要将LOCAL_PACKAGE_NAME的值添加到PRODUCT_PACKAGES才行.而PRODUCT_PACKAGES一般在build/target/product/目录下的文件 ...

  6. HDU 4635 —— Strongly connected——————【 强连通、最多加多少边仍不强连通】

    Strongly connected Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  7. LoadRunner添加Weblogic监控的注意事项(非单纯的操作步骤)

    LoadRunner添加Weblogic监控的注意事项(非单纯的操作步骤)   关于LR如何监控Weblogic(JMX方式)的操作就不在这里多说了,帮助文件和网上的介绍已经非常多了,关键是对各操作步 ...

  8. hdu4635(最多加多少边,使得有向图不是强连通图)

    连边的最后肯定是两个集合x,yx集合的每个元素,到y集合中的每个元素都是单向的边x集合,和y集合都是完全图设a为x集合的点的个数, b为y集合的那么答案就是 a * b + a*(a-1) + b*( ...

  9. POJ 1236--Network of Schools【scc缩点构图 &amp;&amp; 求scc入度为0的个数 &amp;&amp; 求最少加几条边使图变成强联通】

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13325   Accepted: 53 ...

随机推荐

  1. Linux-Java安装

    安装 yum -y install java-1.8.0-openjdk* Tomcat安装:到官网http://tomcat.apache.org/,然后找到Tomcat9下载地址 http://m ...

  2. LeetCode之Weekly Contest 91

    第一题:柠檬水找零 问题: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10  ...

  3. destoon 数据库操作

    1.插入数据 $db->query("INSERT INTO ".get_table($mid)." ($sqlk) VALUES ($sqlv)");  ...

  4. DeepFaceLab小白入门(4):提取人脸图片!

    通过上面级片文章,你应该基本知道了换脸的流出,也能换出一个视频来.此时,你可能会产生好多疑问,比如每个环节点点到底是什么意思,那些黑漆漆屏幕输出的又是什么内容,我换脸效果这么差,该如何提升?等等,好奇 ...

  5. 【android】android对位图文件的支持

    Android 支持以下三种格式的位图文件:.png(首选)..jpg(可接受)..gif(不建议).

  6. Lecture 2

    1. Coordinate(坐标) data for GIS real coordinate system:Cartesian coordinate systems(笛卡尔坐标系) from 3D t ...

  7. Python PycURL的安装使用

    PycURL中文简介:https://blog.csdn.net/qq_41185868/article/details/80487014 PycURL英文简介(如下):http://pycurl.i ...

  8. R-codes-tips

    1. 在shell执行R文件 chmod 0755 file.R Rscript file.R 2.  载入数据 data(dune) 3. attach() 将data.frame添加到R的搜索路径 ...

  9. 深入理解FIFO(包含有FIFO深度的解释)——转载

    深入理解FIFO(包含有FIFO深度的解释) FIFO: 一.先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行 ...

  10. poj-1979 red and black(搜索)

    Time limit1000 ms Memory limit30000 kB There is a rectangular room, covered with square tiles. Each ...