#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;
}

最新文章

  1. iOS获取当前AppStore版本号与更新
  2. javascript_core_03之数组
  3. python处理经过gzip压缩的网页内容
  4. matlab随笔(三)
  5. Linux 磁盘分区
  6. Solr5.3.1通过copyField设置多个field(字段)同时检索
  7. smarty实现缓存
  8. Eclipse中如何恢复已删除文件
  9. tomcat 部署web项目异常
  10. Latin1的所有字符编码
  11. Problem H: STL——括号匹配
  12. hdu 1880 魔咒字典
  13. 向量空间模型(Vector Space Model)的理解
  14. 在html中做表格以及给表格设置高宽字体居中和表格线的粗细
  15. Swift2.0语言教程之函数嵌套调用形式
  16. 【Oracle】强制关闭会话
  17. SaltStack 安装及配置认证
  18. WebService 服务端客户端 实例 HTTPRIO (一) SOAP WSDL
  19. JavaWeb--中文乱码小结
  20. nginx lua模块安装

热门文章

  1. Delphi7中单元文件内各个部分的执行顺序
  2. poj 1061(扩展欧几里得定理求不定方程)
  3. 96.extjs 页面
  4. json用法
  5. Python 39 数据库
  6. Java.Cas4.0客户端接入配置
  7. python2.X现在不能安装Django了:Collecting django Using cached Django-2.0.tar.gz
  8. String,创建对象问题
  9. Java基础13一异常
  10. (转)vuex2.0 基本使用(2) --- mutation 和 action