加一条边后最少还有多少个桥,先Tarjan双联通缩点,

然后建树,求出树的直径,在直径起点终点加一条边去的桥最多,

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stack>
  5. #define N 200001
  6. using namespace std;
  7. int belong[N],head[N],num,ins[N],n,dfs[N],low[N],idx,ans,num1;
  8. struct edge
  9. {
  10. int st,ed,next;
  11. }E[N*10],e[N*10];
  12. void addedge(int x,int y)
  13. {
  14. E[num].st=x;
  15. E[num].ed=y;
  16. E[num].next=head[x];
  17. head[x]=num++;
  18. }
  19. void Addedge(int x,int y)
  20. {
  21. e[num1].st=x;
  22. e[num1].ed=y;
  23. e[num1].next=head[x];
  24. head[x]=num1++;
  25. }
  26. stack<int>Q;
  27. void Tarjan(int u,int father)
  28. {
  29. int i,j,v,flag=0;
  30. low[u]=dfs[u]=idx++;
  31. Q.push(u);
  32. for(i=head[u];i!=-1;i=E[i].next)
  33. {
  34. j=E[i].ed;
  35. if(dfs[j]==-1)
  36. {
  37. Tarjan(j,u);
  38. low[u]=low[u]>low[j]?low[j]:low[u];
  39. }
  40. else if(j==father)
  41. {
  42. if(flag)
  43. low[u]=low[u]>dfs[j]?dfs[j]:low[u];
  44. flag++;
  45.  
  46. }
  47. else low[u]=low[u]>dfs[j]?dfs[j]:low[u];
  48.  
  49. }
  50. if(dfs[u]==low[u])
  51. {
  52. do
  53. {
  54. v=Q.top();
  55. Q.pop();
  56. belong[v]=ans;
  57. }while(v!=u);
  58. ans++;
  59. }
  60. }
  61. void read()
  62. {
  63. memset(head,-1,sizeof(head));
  64. num1=0;
  65. for(int i=0;i<num;i+=2)
  66. {
  67. int x=belong[E[i].st];
  68. int y=belong[E[i].ed];
  69. if(x==y)continue;
  70. Addedge(x,y);
  71. Addedge(y,x);
  72. }
  73. }
  74. int dis;
  75. int dist(int u)
  76. {
  77. ins[u]=1;
  78. int max=0,mmax=0;
  79. for(int i=head[u];i!=-1;i=e[i].next)
  80. {
  81. int v=e[i].ed;
  82. if(ins[v]==1)continue;
  83. int temp=dist(v);
  84. if(temp>mmax)
  85. {
  86. max=mmax;
  87. mmax=temp;
  88. }
  89. else if(temp>max)
  90. {
  91. max=temp;
  92. }
  93. }
  94. if(dis<(mmax+max+1))
  95. dis=mmax+max+1;
  96. return mmax+1;
  97. }
  98. int main()
  99. {
  100. int i,m,x,y;
  101. while(scanf("%d%d",&n,&m),n||m)
  102. {
  103. memset(head,-1,sizeof(head));
  104. num=0;
  105. for(i=0;i<m;i++)
  106. {
  107. scanf("%d%d",&x,&y);
  108. addedge(x,y);
  109. addedge(y,x);
  110. }
  111. memset(dfs,-1,sizeof(dfs));
  112. memset(low,-1,sizeof(low));
  113. memset(ins,0,sizeof(ins));
  114. idx=ans=0;
  115. Tarjan(1,-1);
  116. read();
  117. memset(ins,0,sizeof(ins));
  118. dis=0;
  119. dist(1);
  120. printf("%d\n",ans-dis);
  121. }
  122. return 0;
  123. }

hdu 4612 (双联通+树形DP)的更多相关文章

  1. hdu 4612 双联通缩点+树形dp

    #pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了 #include<stdio.h> ...

  2. hdu 2242双联通分量+树形dp

    /*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #defin ...

  3. hdu 4612 Warm up 双连通+树形dp思想

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

  4. HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价

    Information Disturbing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/ ...

  5. HDU 2242 考研路茫茫—空调教室 (边双连通+树形DP)

    <题目链接> 题目大意: 给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少. 解题分析: 删除一条边,使原连通图 ...

  6. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  7. hdu 5452 Minimum Cut 树形dp

    Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...

  8. HDU 1520 Anniversary party [树形DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...

  9. hdu 1520Anniversary party(简单树形dp)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. 【转】notepad++ 应用学习 -- 列模式,十六进制模式

      Notepad++ 顾名思义,是一个比notepad(Windows下叫记事本)的功能更强的编辑器. 总以为notepad++小巧轻盈,而且开源,要比UE(UltraEdit)好用.因为她支持的视 ...

  2. 精选7款绚丽的HTML5和jQuery图片动画特效

    在HTML5出现后,图片就变得更加富有动感了,各种图片动画特效也层出不穷,例如图片播放器.图片导航.3D图片动画等等.本文将精选几款具有代表性的HTML5和jQuery图片动画特效,绚丽的画面.实用的 ...

  3. 食物卡喉别拍背部!救了100多万人性命的“海姆立克急救法"

    先讲三个事例: 一.近日,浙江金华一个17月大的小贝边玩边吃花生,被噎住.10多分钟后,奶奶发现小贝大口喘气,以为他玩累了就抱他回家,等父母赶到送医已晚.小贝大脑受损严重-父母含泪同意放弃治疗,孩子走 ...

  4. sed awk 要获得每行的最后一个逗号后边的内容

    获得每行的最后一个逗号后边的内容.例如:KIAA1967 KIAA1967, xxxxSECIS biding proin 2-like, SECISBP2L, yyyy 1234ankyrin re ...

  5. Android开发之bug-No Activity found to handle Intent

    android.content.ActivityNotFoundException: No Activity found to handle Intent 做Android开发中,使用隐式intent ...

  6. js createElement

      http://www.w3schools.com/js/js_htmldom_nodes.asp var child = document.getElementById("p1" ...

  7. poj 1924 Paths on a Grid(组合数学)

    题目:http://poj.org/problem?id=1942 题意:给定一个矩形网格的长m和高n,其中m和n都是unsigned int32类型,一格代表一个单位,就是一步,求从左下角到右上角有 ...

  8. 取出block所对应的hash值

    /**********************************************************************//** Gets the hash value of t ...

  9. BZOJ_1019_[SHOI2008]_汉诺塔_(DP)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1019 汉诺塔游戏,但是有移动优先级,在不违反原有规则的情况下,给定优先移动目标.求完成游戏所需 ...

  10. 【 D3.js 选择集与数据详解 — 5 】 处理模板的应用

    在[选择集与数据 - 4]一文中,介绍了一个update.enter.exit的处理模板,这个模板很常用,本文将通过一个例子来讲解其使用方法. 1. 模板 复习一下上一章提到的模板. //绑定数据后, ...