CodeForces - 1000E We Need More Bosses

题面在这里!

 

    依然一眼题,求出割边之后把图缩成一棵树,然后直接求最长链就行了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;
}

 

posted @ 2018-07-01 19:58  蒟蒻JHY  阅读(298)  评论(0编辑  收藏  举报