题意已经很明显了,将图中的环进行缩点,缩点后会形成一棵树,树的直径就是我们所要求的
现在的可以找到的是v-dcc,e-dcc缩点,考虑一下环的特点,即没有割边,因此利用割边进行缩点就是我们需要的,这个就挂了个对环缩点的模板
分析完了后我们就发现这就是两个模板的组合,所以直接贴模板即可
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod=998244353;
const int M=1e8+5;
const int N=1e6+5;//?????????? 4e8
struct node
{
int ver,next;
}e[N];
int dfn[N],low[N],brige[N];
int c[N],instack[N],num,top,cnt;
int tot=1,head[N];
vector < int > a[N];
int v[N],f[N];
int n,m;
int ans;
void add(int x,int y)
{
e[++tot].ver=y;
e[tot].next=head[x];
head[x]=tot;
}
void addedge(int x,int y)
{
add(x,y);add(y,x);
}
void tarjan(int x,int in_edge)
{
dfn[x]=low[x]=++num;
instack[++top]=x;
for(re i=head[x];i;i=e[i].next)
{
int y=e[i].ver;
if(!dfn[y])
{
tarjan(y,i);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]) brige[i]=brige[i^1]=1;
}
else if(i!=(in_edge^1)) low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x])
{
cnt++;
int y;
do
{
y=instack[top--];
c[y]=cnt;
}while(x!=y);
}
}
void dfs(int x)
{
v[x]=1;
int sz=a[x].size();
for(re i=0;i<sz;i++)
{
int y=a[x][i];
if(v[y]) continue;
dfs(y);
ans=max(ans,f[x]+f[y]+1);
f[x]=max(f[x],f[y]+1);
}
}
void solve()
{
cin>>n>>m;
for(re i=1;i<=m;i++)
{
int x,y;
scanf("%lld%lld",&x,&y);
addedge(x,y);
}
for(re i=1;i<=n;i++) if(!dfn[i]) tarjan(i,0);
for(re x=1;x<=n;x++) for(re i=head[x];i;i=e[i].next)
{
int y=e[i].ver;
if(c[x]==c[y]) continue;
a[c[x]].pb(c[y]);
a[c[y]].pb(c[x]);
}
dfs(1);
cout<<ans<<endl;
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
// printf("Case %d:\n",index);
solve();
// puts("");
}
return 0;
}
/*
1
6 5
0 0 0 122 499 8888
*/