依然一眼题,求出割边之后把图缩成一棵树,然后直接求最长链就行了2333
#include<bits/stdc++.h> #define ll long long using namespace std; #define pb push_back const int N=300005; vector<int> g[N]; int dfn[N],low[N],num=1,hd[N],n,m,ans=0,v[N]; int to[N*2],ne[N*2],cnt,col[N],mx[N],dc; bool ban[N*2]; inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;} void tarjan(int x,int fa){ dfn[x]=low[x]=++dc; for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa) if(!dfn[to[i]]){ tarjan(to[i],x); low[x]=min(low[x],low[to[i]]); if(low[to[i]]>dfn[x]) ban[i]=ban[i^1]=1; } else low[x]=min(low[x],dfn[to[i]]); } void B(int x){ col[x]=cnt; for(int i=hd[x];i;i=ne[i]) if(ban[i]){ if(col[to[i]]&&v[to[i]]!=cnt){ v[to[i]]=cnt; g[cnt].pb(col[to[i]]); g[col[to[i]]].pb(cnt); } } else if(!col[to[i]]) B(to[i]); } void dfs(int x,int fa){ for(int i:g[x]) if(i!=fa){ dfs(i,x),ans=max(ans,mx[i]+1+mx[x]); mx[x]=max(mx[x],mx[i]+1); } } int main(){ scanf("%d%d",&n,&m); int uu,vv; for(int i=1;i<=m;i++){ scanf("%d%d",&uu,&vv); add(uu,vv),add(vv,uu); } tarjan(1,0); for(int i=1;i<=n;i++) if(!col[i]){ cnt++,B(i); } dfs(1,0); printf("%d ",ans); return 0; }