点的双连通分量 v-dcc
作者:
limuru
,
2024-10-20 17:12:46
,
所有人可见
,
阅读 1
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int h[N],e[N],ne[N],idx;
int dfn[N],low[N],timestamp;
int root,ans;
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++timestamp;
int cnt=0;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(!dfn[j])
{
tarjan(j);
low[u]=min(low[u],low[j]);
if(low[j]>=dfn[u])
{
cnt++;
}
}
else
{
low[u]=min(low[u],dfn[j]);
}
}
if(u!=root)
{
cnt++;
}
ans=max(ans,cnt);
}
signed main()
{
while(cin>>n>>m,n||m)
{
memset(dfn,0,sizeof dfn);
memset(h,-1,sizeof h);
idx=timestamp=0;
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
ans=0;
int cnt=0;
for(root=0;root<n;root++)
{
if(!dfn[root])
{
cnt++;
tarjan(root);
}
}
cout<<ans+cnt-1<<endl;
}
return 0;
}