<题目链接>

题目大意:

给你一张有向图,问在保证该图不能成为强连通图的条件下,最多能够添加几条有向边。

解题分析:

我们从反面思考,在该图是一张有向完全图的情况下,最少删去几条边能够使其不是强连通图。即,开始的时候,图的总边树为 n*(n-1),减去m条已有的边。然后把原图中所有的强连通块进行缩点,对于缩好的点,我们把其分成两部分,保证这两部分点不能够相互可达(即这两部分不是强连通),所以我们要减去一个部分到另一部分的所有同一方向的边,比如将连通块1到连通块2的所有边都删除,这样,这两部分点就不强连通,整张图也不是强连通图。那如何使删除的边最小呢?因为删除的边为cnt*(n-cnt),根据简单的数学常识,必然是cnt和(n-cnt)差值最大的时候,他们的乘积最小,所以我们只要记录所有连通块中点数最少的数量即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8. const int N = ;
  9. const int INF = 0x3f3f3f3f;
  10.  
  11. struct Edge{
  12. int to,next;
  13. }edge[N<<];
  14.  
  15. ll n,m,cnt,head[N];
  16. ll tot,top,atype;
  17. ll dfn[N],low[N],vis[N],stack[N],belong[N],indeg[N],outdeg[N],sum[N];
  18. void init(){
  19. cnt=,tot=,top=,atype=;;
  20. memset(head,-,sizeof(head));
  21. memset(dfn,,sizeof(dfn));
  22. memset(low,,sizeof(low));
  23. memset(vis,,sizeof(vis));
  24. memset(belong,,sizeof(belong));
  25. memset(indeg,,sizeof(indeg));
  26. memset(outdeg,,sizeof(outdeg));
  27. memset(sum,,sizeof(sum));
  28. }
  29. void addedge(int u,int v){
  30. edge[++cnt].to=v,edge[cnt].next=head[u];
  31. head[u]=cnt;
  32. }
  33. void Tarjan(int u){
  34. dfn[u]=low[u]=++tot;
  35. stack[top++]=u;
  36. vis[u]=;
  37. for(int i=head[u];i!=-;i=edge[i].next){
  38. int v=edge[i].to;
  39. if(!dfn[v]){
  40. Tarjan(v);
  41. low[u]=min(low[u],low[v]);
  42. }else if(vis[v]){
  43. low[u]=min(low[u],dfn[v]);
  44. }
  45. }
  46. if(dfn[u]==low[u]){
  47. atype++;
  48. int v;
  49. do{
  50. v=stack[--top];
  51. belong[v]=atype; //将该强连通块缩点染色
  52. sum[atype]++; //统计该强连通块的点的数量
  53. vis[v]=;
  54. }while(u!=v);
  55. }
  56. }
  57.  
  58. int main(){
  59. int t,cases=;
  60. scanf("%d",&t);
  61. while(t--){
  62. scanf("%lld%lld",&n,&m);
  63. init();
  64. for(int i=;i<m;i++){
  65. int u,v;scanf("%d%d",&u,&v);
  66. addedge(u,v);
  67. }
  68. for(int i=;i<=n;i++)
  69. if(!dfn[i])Tarjan(i);
  70. if(atype==){
  71. printf("Case %d: -1\n",++cases);
  72. continue;
  73. }
  74. for(int u=;u<=n;u++)
  75. for(int i=head[u];i!=-;i=edge[i].next){
  76. int v=edge[i].to;
  77. if(belong[u]!=belong[v]){ //统计每个连通块的初度和入度
  78. outdeg[belong[u]]++;
  79. indeg[belong[v]]++;
  80. }
  81. }
  82. ll ans=,cnt=INF;
  83. for(int i=;i<=atype;i++)
  84. if(indeg[i]==||outdeg[i]==) //更新初度和入读为0的联通块的数量最小值,因为只需删除一个方向的边
  85. cnt=min(cnt,sum[i]);
  86. ans=n*(n-)-m-cnt*(n-cnt); //n*(n-1)为有向完全图的所有边,m为原图已有的边,cnt*(n-cnt)为分成两部分后删除一个方向的边
  87. printf("Case %d: %lld\n",++cases,ans);
  88. }
  89. return ;
  90. }

2018-11-08

HDU 4635 Strongly connected (强连通分量+缩点)的更多相关文章

  1. HDU 4635 Strongly connected (强连通分量)

    题意 给定一个N个点M条边的简单图,求最多能加几条边,使得这个图仍然不是一个强连通图. 思路 2013多校第四场1004题.和官方题解思路一样,就直接贴了~ 最终添加完边的图,肯定可以分成两个部X和Y ...

  2. hdu 4635 Strongly connected 强连通缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...

  3. HDU 4635 Strongly connected(强连通)经典

    Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. hdu 4635 Strongly connected 强连通

    题目链接 给一个有向图, 问你最多可以加多少条边, 使得加完边后的图不是一个强连通图. 只做过加多少条边变成强连通的, 一下子就懵逼了 我们可以反过来想. 最后的图不是强连通, 那么我们一定可以将它分 ...

  5. HDU 4635 Strongly connected (2013多校4 1004 有向图的强连通分量)

    Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. HDU 4635 Strongly connected(强连通分量,变形)

    题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提 ...

  7. HDU 4635 - Strongly connected(2013MUTC4-1004)(强连通分量)

    t这道题在我们队属于我的范畴,最终因为最后一个环节想错了,也没搞出来 题解是这么说的: 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯 ...

  8. HDU 4635 Strongly connected ——(强连通分量)

    好久没写tarjan了,写起来有点手生,还好1A了- -. 题意:给定一个有向图,问最多添加多少条边,让它依然不是强连通图. 分析:不妨考虑最大时候的临界状态(即再添加一条边就是强连通图的状态),假设 ...

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

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

随机推荐

  1. Confluence 6 审查日志的对象

    审查日志记录一下事件的信息,这个记录不是详细的信息列表.但是这些信息能够让你了解你能够在日志中看到些什么内容. 空间 创建和删除一个空间. 编辑空间细节,主题,配色方案或者样式表. 修改空间权限,包括 ...

  2. Confluence 6 附件存储文件系统的分级

    从 Confluence 3.0 开始,附件的存储方式有了重大的改变和升级.如果你是从 Confluence 2.10 及其早期版本升级上来的,请参考 Upgrading Confluence 页面中 ...

  3. Confluence 6 修改特定的空间标识图片

    空间管理员可以为他们管理的空间修改空间标识图片.这个修改将会覆盖默认的空间标识图片,任何对默认空间图标表示的修改将不会对已经修改的空间标识图片产生影响.请查看上面的例子中的 'Sample Space ...

  4. 【数据库】MySQL的左连接、右连接和全连接的实现

    表student:+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | Jim | 18 || 2 | ...

  5. 微信小程序简单介绍 一

    一 组件及api网址: 组件 :https://developers.weixin.qq.com/miniprogram/dev/component/view.html api:https://dev ...

  6. DSB

    Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...

  7. django----基于Form组件实现的增删改和基于ModelForm实现的增删改

    一.ModelForm的介绍 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 lab ...

  8. Nginx详解二十八:Nginx架构篇Nginx+Lua的安全waf防火墙

    Nginx+Lua的安全waf防火墙 看一下别人写好的:https://github.com/loveshell/ngx_lua_waf 先安装git:yum -y install git 在/opt ...

  9. jQuery之CSS选择器的处理机制

    <!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...

  10. Win8.1 查看 “Windows 体验指数“

    啥是 Windows 体验指数 ? 引用MS的介绍: http://windows.microsoft.com/zh-cn/windows7/products/features/windows-exp ...