1. /**
  2. 题目大意:
  3. 给你一个无向连通图,问加上一条边后得到的图的最少的割边数;
  4.  
  5. 算法思想:
  6. 图的边双连通Tarjan算法+树形DP;
  7. 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求最长链,连接首尾即可;剩下的连通块即为所求答案;
  8.  
  9. 算法思路:
  10. 对图深度优先搜索,定义DFN(u)为u在搜索树中被遍历到的次序号;
  11. 定义Low(u)为u或u的子树中能通过非父子边追溯到的最早的节点,即DFN序号最小的节点;
  12. 则有:
  13. Low(u)=Min
  14. {
  15. DFN(u),
  16. Low(v),(u,v)为树枝边,u为v的父节点
  17. DFN(v),(u,v)为指向栈中节点的后向边(非横叉边)
  18. }
  19.  
  20. 一个顶点u是割点,当且仅当满足(1)或(2)
  21. (1)u为树根,且u有多于一个子树;
  22. (2)u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得DFN(u)<=Low(v);
  23.  
  24. 一条无向边(u,v)是桥,当且仅当(u,v)为树枝边且满足DFN(u)<Low(v);
  25.  
  26. **/
  27. #pragma comment(linker,"/STACK:102400000,102400000")
  28. #include<iostream>
  29. #include<cstdio>
  30. #include<cstring>
  31. #include<algorithm>
  32. #include<map>
  33. #include<stack>
  34. using namespace std;
  35.  
  36. const int N=200010;
  37. const int M=1000010;
  38.  
  39. struct node
  40. {
  41. int v;
  42. int next;
  43. } e[M*2];
  44.  
  45. int head[N];
  46. int dfn[N],low[N],dp[N][2];//dp[i][0]表示第i个节点的子树中最长的链,dp[i][1]表示第i个节点的子树中第二长的链
  47. bool visit[M];
  48. int n,m,cnt,res;
  49.  
  50. void AddEdge(int u,int v)
  51. {
  52. e[cnt].v=v;
  53. e[cnt].next=head[u];
  54. head[u]=cnt++;
  55. }
  56.  
  57. void Tarjan(int u)
  58. {
  59. dfn[u]=low[u]=cnt++;
  60. dp[u][0]=dp[u][1]=0;
  61. for(int i=head[u]; i!=-1; i=e[i].next)
  62. {
  63. int j=e[i].v;
  64. if(!visit[i>>1])
  65. {
  66. visit[i>>1]=true;
  67. if(dfn[j]==0)//跟强连通一样
  68. {
  69. Tarjan(j);
  70. res+=dfn[u]<low[j];//统计连通块,比实际数目少一个,就是回溯的时候的最后一个
  71. int temp=dp[j][0]+(dfn[u]<low[j]);
  72. if(temp>dp[u][0])
  73. {
  74. dp[u][1]=dp[u][0];
  75. dp[u][0]=temp;
  76. }
  77. else if(temp>dp[u][1])
  78. {
  79. dp[u][1]=temp;
  80. }
  81. low[u]=min(low[u],low[j]);
  82. }
  83. else
  84. low[u]=min(low[u],dfn[j]);
  85. }
  86. }
  87. }
  88.  
  89. int main()
  90. {
  91. #ifndef ONLINE_JUDGE
  92. freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);
  93. #endif
  94. while(scanf("%d%d",&n,&m)&&n+m)
  95. {
  96. cnt=0;
  97. res=0;
  98. memset(dfn,0,sizeof(dfn));
  99. memset(low,0,sizeof(low));
  100. memset(head,-1,sizeof(head));
  101. for(int i=0; i<m; i++)
  102. {
  103. int u,v;
  104. scanf("%d%d",&u,&v);
  105. AddEdge(u,v);
  106. AddEdge(v,u);
  107. }
  108. cnt=1;
  109. memset(visit,0,sizeof(visit));
  110. Tarjan(1);
  111. int temp=0;
  112. for(int i=1; i<=n; i++)
  113. {
  114. temp=max(temp,dp[i][0]+dp[i][1]);//+的时候没有算当前点所在的块,但是res也少算一个
  115. }
  116. printf("%d\n",res-temp);
  117. }
  118. return 0;
  119. }

HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)的更多相关文章

  1. 图的强连通&双连通

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

  2. 图的割点 桥 双连通(byvoid)

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  3. 图之强连通--Tarjan算法

    强连通分量 简介 在阅读下列内容之前,请务必了解图论基础部分. 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Components ...

  4. HDU 4612 Warm up(2013多校2 1002 双连通分量)

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Su ...

  5. HDU 4690 EBCDIC (2013多校 1005题 胡搞题)

    EBCDIC Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total Su ...

  6. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

  7. HDU 4704 Sum (2013多校10,1009题)

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submi ...

  8. HDU 4699 Editor (2013多校10,1004题)

    Editor Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  9. HDU 4696 Answers (2013多校10,1001题 )

    Answers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

随机推荐

  1. HTML5新增的属性和废除的属性

    HTML5中,在新增加和废除很多元素的同时,也增加和废除了很多属性. 新增的属性 1.表单相关的属性 对input(type=text).select.textarea与button指定autofoc ...

  2. 第一个androidAPP项目总结—ListView的上拉和下拉

    1.下拉刷新 需继承implements SwipeRefreshLayout.OnRefreshListener @Overridepublic void onRefresh() { new Wea ...

  3. php Socket基础

    ◆ Socket 基础PHP使用Berkley的socket库来创建它的连接.socket只不过是一个数据结构.你使用这个socket数据结构去开始一个客户端和服务器之间的会话.这个服务器是一直在监听 ...

  4. 智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )

    SQL Optimizer for SQL Server 帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 SQL Optimizer for SQL Server 让 SQL Serve ...

  5. solr集群solrCloud的搭建

    上一章讲了solr单机版的搭建,本章将讲解sole集群的搭建.solr集群的搭建需要使用到zookeeper,搭建参见zookeeper集群的安装 一.solr实例的搭建 1. tomcat安装 这里 ...

  6. 解决secureCRT数据库里没有找到防火墙 '无'问题,转自:http://jingyan.baidu.com/article/9989c74601274bf649ecfe74.html

    中文版的secureCRT由于汉化的问题(把null翻译成无了),导致每次打开都会有个防火墙的错误提示:数据库里没有找到防火墙 '无' 此会话将尝试不通过防火墙进行连接.出现这个错误的原因是在secu ...

  7. Vim模式

    Vim是从vi发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和Emacs并列成为类Unix系统用户最喜欢的编辑器.    Vim的第一个版本由布莱姆 ...

  8. Spring4.0学习笔记(1) —— 基础知识

    1.基本定义 IOC: 其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了 IOC之后,容器主动将资源推送给它所管理的组件,组件索要做 ...

  9. 無心插柳的Linux學習者代言人——蔡德明

    誰是「蔡德明」恐怕沒有多少人知道,不過提到「鳥哥」這個稱號,在臺灣的Linux社群幾乎是無人不知無人不曉,蔡德明正是鳥哥的本名.鳥哥究竟多有名? 如果你是有意學習Linux的初學者,卻不知如何下手,1 ...

  10. poj 3628 Bookshelf 2

    http://poj.org/problem?id=3628 01背包 #include <cstdio> #include <iostream> #include <c ...