1. #pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了
  2. #include<stdio.h>
  3. #include<queue>
  4. #include<string.h>
  5. using namespace std;
  6. #define N 210000
  7. #define inf 99999999
  8. struct node {
  9. int u,v,w,next;
  10. }bian[N*20],biantwo[N*20];
  11. int head[N],yong,dfn[N],low[N],yongtwo,index,top,cnt,stac[N],visit[N];
  12. int suo[N];
  13. void init(){
  14. memset(head,-1,sizeof(head));
  15. memset(dfn,0,sizeof(dfn));
  16. memset(low,0,sizeof(low));
  17. memset(visit,0,sizeof(visit));
  18. index=0;top=0;cnt=0;yong=0;
  19. yongtwo=0;
  20. }
  21. void addedge(int u,int v) {
  22. bian[yong].u=u;
  23. bian[yong].v=v;
  24. bian[yong].next=head[u];
  25. head[u]=yong++;
  26. }
  27. void addedgetwo(int u,int v,int w) {
  28. biantwo[yongtwo].u=u;
  29. biantwo[yongtwo].v=v;
  30. biantwo[yongtwo].w=w;
  31. biantwo[yongtwo].next=head[u];
  32. head[u]=yongtwo++;
  33. }
  34. int Min(int a,int b) {
  35. return a>b?b:a;
  36. }
  37. void tarjan(int u,int pre) {//双联通缩点
  38. int i;
  39. dfn[u]=low[u]=++index;
  40. stac[++top]=u;
  41. visit[u]=1;
  42. for(i=head[u];i!=-1;i=bian[i].next) {
  43. int v=bian[i].v;
  44. if(i==(pre^1))continue;
  45. if(!dfn[v]) {
  46. tarjan(v,i);
  47. low[u]=Min(low[u],low[v]);
  48. }
  49. else
  50. if(visit[v])
  51. low[u]=Min(low[u],dfn[v]);
  52. }
  53. if(low[u]==dfn[u]){
  54. ++cnt;
  55. int t;
  56. do{
  57. t=stac[top--];
  58. suo[t]=cnt;
  59. visit[t]=0;
  60. }while(t!=u);
  61. }
  62. }
  63. int dis[N],n;
  64. int bfs(int u) {//求树的直径
  65. int i,vis[N],j;
  66. queue<int>q;
  67. memset(vis,0,sizeof(vis));
  68. for(i=1;i<=cnt;i++)
  69. dis[i]=inf;
  70. q.push(u);
  71. vis[u]=1;
  72. dis[u]=0;
  73. while(!q.empty()) {
  74. int d=q.front();
  75. q.pop();
  76. for(i=head[d];i!=-1;i=biantwo[i].next) {
  77. int v=biantwo[i].v;
  78. if(vis[v]==0&&dis[v]>dis[d]+biantwo[i].w){
  79. dis[v]=dis[d]+biantwo[i].w;
  80. vis[v]=1;
  81. q.push(v);
  82. }
  83. }
  84. }
  85. int mi=inf,temp;
  86. //printf("%d %d\n",dis[1],dis[2]);
  87. for(i=1;i<=cnt;i++)
  88. if(mi>dis[i]) {
  89. mi=dis[i];
  90. temp=i;
  91. }
  92. // printf("%d\n",mi);
  93. return temp;
  94. }
  95. int main() {
  96. int m,i,j;
  97. while(scanf("%d%d",&n,&m),n||m) {
  98. init();
  99. while(m--){
  100. scanf("%d%d",&i,&j);
  101. addedge(i,j);
  102. addedge(j,i);
  103. }
  104. tarjan(1,-1);
  105. memset(head,-1,sizeof(head));
  106. for(i=0;i<yong;i++) {
  107. int u=bian[i].u,v=bian[i].v;
  108. if(suo[u]!=suo[v]) {
  109. addedgetwo(suo[u],suo[v],-1);
  110. addedgetwo(suo[v],suo[u],-1);
  111. }
  112. }
  113. printf("%d\n",cnt+dis[bfs(bfs(1))]-1);
  114. }
  115. return 0;
  116. }

hdu 4612 双联通缩点+树形dp的更多相关文章

  1. hdu 4612 (双联通+树形DP)

    加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:10240 ...

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

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

  3. 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)

    题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ...

  4. poj 3694双联通缩点+LCA

    题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...

  5. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  6. Codeforces 1000 组合数可行线段倒dp 边双联通缩点求树直径

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std ...

  7. HDU 2242 连通分量缩点+树形dp

    题目大意是: 所有点在一个连通图上,希望去掉一条边得到两个连通图,且两个图上所有点的权值的差最小,如果没有割边,则输出impossible 这道题需要先利用tarjan算法将在同一连通分量中的点缩成一 ...

  8. HDU 1520.Anniversary party 基础的树形dp

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

  9. HDU 3586 Information Disturbing(二分+树形dp)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...

随机推荐

  1. B1076 [SCOI2008]奖励关 状压dp&&期望dp

    这个题的n<15,一看就是状压dp.但是状态不是很好想.f[][]存i关的状态j. 这个题另一个关键思想在于倒推,我一开始想的是正推,但是只能记忆化了. 题干: 题目描述 你正在玩你最喜欢的电子 ...

  2. B1789 Y型项链 贪心

    想明白之后就是一道大水题,就是两两把最长公共前缀求出来,然后直接取最长的,然后就直接暴力算就行了... 题干: Description 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在 ...

  3. 简述RTMPDump与编译移植

    RTMPDump主页 ,RTMPDump库主要包含三部分: 1.一个基本的客户端程序 2.两个服务器程序(rtmpsrv.rtmpsuck) 3.一个支持rtmp协议的库—librtmp 下载RTMP ...

  4. javascript从作用域链的角度看闭包

    闭包 闭包是一个能访问外部函数定义的变量的函数. 为什么? 当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不再存在父作用域了,这就是作用 ...

  5. HBase编程 API入门系列之get(客户端而言)(2)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面是基础,如下 HBase编程 API入门系列之put(客户端而言)(1) package zhouls.bigdata.Hba ...

  6. SQLServer2008 在where条件中使用CASE WHEN

    create table #temp(    id int identity(1,1),    name varchar(20),    startYear int,    startMonth in ...

  7. rabbit channel参数

    channel.exchangeDeclare() channel.ExchangeDeclare(string exchange: "cjlTest",string  type: ...

  8. Android开机图片替换

    Android开机图片替换 Android从启动到进入Launcher一共会展示三张图片,如果只是更换静态图则更换这三张图片即可,要想换成动画那就要另外操作. 首先查找这个文件:    /bootab ...

  9. 数据库操作(一)DML

    1.数据库 数据库可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增.查询.更新.删除等操作. 所谓“数据库”是以一定方式储存在一起.能与多个用户共享.具有尽可能小的冗余度.与 ...

  10. Python—字符串+变量

    字符串转义字符格式化内建函数(后延)转义字符用一个特殊的方法表示出一系列不方便写出的内容,比如回车键,换行键,退格键借助反斜杠字符,一旦字符串中出现反斜杠,则反斜杠后面一个火几个字符表示已经不是原来的 ...