zoukankan      html  css  js  c++  java
  • CodeForces

    题面在这里!

        依然一眼题,求出割边之后把图缩成一棵树,然后直接求最长链就行了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;
    }
    
  • 相关阅读:
    oracle 随机函数
    cmd和dos的区别
    SAP HANA 常用函数
    编程语言发展史
    PL/SQL Job
    ETL工具总结
    JDK、JRE、JVM三者间的关系
    Redis过滤器如何与Envoy代理一起使用
    apache配置https
    kubernetes监控和性能分析工具:heapster+influxdb+grafana
  • 原文地址:https://www.cnblogs.com/JYYHH/p/9251100.html
Copyright © 2011-2022 走看看