#pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
#define N 210000
#define inf 99999999
struct node {
int u,v,w,next;
}bian[N*20],biantwo[N*20];
int head[N],yong,dfn[N],low[N],yongtwo,index,top,cnt,stac[N],visit[N];
int suo[N];
void init(){
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(visit,0,sizeof(visit));
index=0;top=0;cnt=0;yong=0;
yongtwo=0;
}
void addedge(int u,int v) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void addedgetwo(int u,int v,int w) {
biantwo[yongtwo].u=u;
biantwo[yongtwo].v=v;
biantwo[yongtwo].w=w;
biantwo[yongtwo].next=head[u];
head[u]=yongtwo++;
}
int Min(int a,int b) {
return a>b?b:a;
}
void tarjan(int u,int pre) {//双联通缩点
int i;
dfn[u]=low[u]=++index;
stac[++top]=u;
visit[u]=1;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(i==(pre^1))continue;
if(!dfn[v]) {
tarjan(v,i);
low[u]=Min(low[u],low[v]);
}
else
if(visit[v])
low[u]=Min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
++cnt;
int t;
do{
t=stac[top--];
suo[t]=cnt;
visit[t]=0;
}while(t!=u);
}
}
int dis[N],n;
int bfs(int u) {//求树的直径
int i,vis[N],j;
queue<int>q;
memset(vis,0,sizeof(vis));
for(i=1;i<=cnt;i++)
dis[i]=inf;
q.push(u);
vis[u]=1;
dis[u]=0;
while(!q.empty()) {
int d=q.front();
q.pop();
for(i=head[d];i!=-1;i=biantwo[i].next) {
int v=biantwo[i].v;
if(vis[v]==0&&dis[v]>dis[d]+biantwo[i].w){
dis[v]=dis[d]+biantwo[i].w;
vis[v]=1;
q.push(v);
}
}
}
int mi=inf,temp;
//printf("%d %d\n",dis[1],dis[2]);
for(i=1;i<=cnt;i++)
if(mi>dis[i]) {
mi=dis[i];
temp=i;
}
// printf("%d\n",mi);
return temp;
}
int main() {
int m,i,j;
while(scanf("%d%d",&n,&m),n||m) {
init();
while(m--){
scanf("%d%d",&i,&j);
addedge(i,j);
addedge(j,i);
}
tarjan(1,-1);
memset(head,-1,sizeof(head));
for(i=0;i<yong;i++) {
int u=bian[i].u,v=bian[i].v;
if(suo[u]!=suo[v]) {
addedgetwo(suo[u],suo[v],-1);
addedgetwo(suo[v],suo[u],-1);
}
}
printf("%d\n",cnt+dis[bfs(bfs(1))]-1);
}
return 0;
}

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. 在MTK平台里,,函数kal_prompt_trace起什么作用???Kal_prompt_trace的参数有表示什么?

    在MTK平台里,,函数kal_prompt_trace起什么作用???Kal_prompt_trace的参数有表示什么?一直弄不明白,但是很多函数的开头就是这个函数,,而且一般有三个参数-- kal_ ...

  2. 将tflearn的模型保存为pb,给TensorFlow使用

    参考:https://github.com/tflearn/tflearn/issues/964 解决方法: """ Tensorflow graph freezer C ...

  3. ACM_写数字

    写数字 Time Limit: 2000/1000ms (Java/Others) Problem Description: 把由1开始的自然数依次写下来:123456789101112……,重新分组 ...

  4. C - Anton and Danik

    Problem description Anton likes to play chess, and so does his friend Danik. Once they have played n ...

  5. P1401 城市(30分,正解网络流)

    题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...

  6. RecyclerView的基础用法

    为了让RecyclerView可以在所有的Android版本中都能使用,Android开发团队将RecyclerView定义在support.v7包当中.在使用该控件时需要打开当前Modile的bui ...

  7. kotlin第一个项目的搭建

    怎么在Android Studio中使用Kotlin? 1.使用Android Studio的插件 2.将Android Studio升级到3.0版本:目前不推荐,因为3.0的版本目前还是Dev Ch ...

  8. Burn Down Chart(2018.5.28~2018.6.3)

    任务安排 (2018.6.2 更新——前端总进度) (2018.6.3 更新——后端燃尽图) 娄雨禛[前端部分] 曾子轩[后端部分+燃尽图] 前端 齐天扬+刘鼎乾:设计两组页面,只要求框架和简单的 c ...

  9. CXF-JAX-RS开发(二)spring整合CXF-JAX-RS

    一.创建maven工程[Packaging:war] 1.目录结构 2.坐标书写 二.导入依赖和tomcat服务器插件 <dependencies> <!-- CXF --> ...

  10. UNIX SOCKET编程简介

    1  .  Layered Model of Networking Socket  编程的层次模型如下图所示,   最上面是应用层,应用层下面的是  SOCKET API  层,再下面是传输层和网络层 ...