图论还真心难搞,
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<algorithm> #include<vector> using namespace std; const int N=200055; int dfn[N],low[N],belong[N],sta[N]; vector<int> e[N],tree[N]; int n,m,index,color,top; int dis[N]; void init() { memset(dfn,0,sizeof(dfn)); index=0; top=0; color=0; for(int i=0;i<=n;i++) { e[i].clear(); tree[i].clear(); } } int min(int a,int b) { if(a<b) return a; else return b; } void tarjan(int u,int fa) { dfn[u]=low[u]=++index; int flag=0; sta[++top]=u; for(int i=0;i<e[u].size();i++) { int v=e[u][i]; if(!dfn[v]) { tarjan(v,u); low[u]=min(low[u],low[v]); }else if(v==fa) { if(flag) low[u]=min(low[u],dfn[v]); flag++; } else low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { color++; int x; do { x=sta[top--]; belong[x]=color; }while(x!=u); } } void buildtree() { for(int i=1;i<=n;i++) { for(int j=0;j<e[i].size();j++) { int v=e[i][j]; if(belong[i]!=belong[v]) { tree[belong[i]].push_back(belong[v]); tree[belong[v]].push_back(belong[i]); } } } } void dfs(int u) { for(int i=0;i<tree[u].size();i++) { int v=tree[u][i]; if(dis[v]==-1) { dis[v]=dis[u]+1; dfs(v); } } } int main() { int a,b,i; while(scanf("%d%d",&n,&m),n+m) { init(); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); if(a==b)continue; e[a].push_back(b); e[b].push_back(a); } tarjan(1,-1); buildtree(); memset(dis,-1,sizeof(dis)); dis[1]=0; dfs(1); int k,max=-1; for(i=1;i<=color;i++) { if(dis[i]>max) { max=dis[i]; k=i; } } memset(dis,-1,sizeof(dis)); dis[k]=0; dfs(k); for(i=1;i<=color;i++) { if(dis[i]>max) max=dis[i]; } printf("%d ",color-max-1); } return 0; }