标签:back FN style IV cpp pre for def AC
依然一眼题,求出割边之后把图缩成一棵树,然后直接求最长链就行了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\n",ans);
return 0;
}
CodeForces - 1000E We Need More Bosses
标签:back FN style IV cpp pre for def AC
原文地址:https://www.cnblogs.com/JYYHH/p/9251100.html