• We Need More Bosses CodeForces


    大意: 给定无向连通图, 定义两个点$s,t$个价值为切断一条边可以使$s,t$不连通的边数. 求最大价值.

    显然只有桥会产生贡献. 先对边双连通分量缩点建树, 然后求直径即为答案.

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #define REP(i,a,n) for(int i=a;i<=n;++i)
    #define pb push_back
    using namespace std;
    
    const int N = 3e5+10;
    int n,m,clk,ans,cnt;
    int dfn[N],low[N],dep[N],q[N],bcc[N];
    vector<int> g[N],gg[N];
    
    void dfs(int x, int fa) {
    	dfn[x]=low[x]=++clk;
    	q[++*q] = x;
    	for (int y:g[x]) if (y!=fa) {
    		if (dfn[y]) low[x]=min(low[x],dfn[y]);
    		else {
    			dfs(y,x);
    			low[x] = min(low[x],low[y]);
    		}
    	}
    	if (low[x]==dfn[x]) {
    		++cnt;
    		do bcc[q[*q]] = cnt; while (q[(*q)--]!=x);
    	}
    }
    void dfs2(int x, int fa) {
    	for (int y:gg[x]) if (y!=fa) {
    		dfs2(y,x);
    		ans = max(ans, dep[x]+dep[y]+1);
    		dep[x] = max(dep[x],dep[y]+1);
    	}
    }
    int main() {
    	scanf("%d%d", &n, &m);
    	while (m--) {
    		int u, v;
    		scanf("%d%d", &u, &v);
    		g[u].pb(v),g[v].pb(u);
    	}
    	dfs(1,0);
    	REP(i,1,n) for (int j:g[i]) {
    		if (bcc[i]!=bcc[j]) { 
    			gg[bcc[i]].pb(bcc[j]);
    		}
    	}
    	dfs2(1,0);
    	printf("%d
    ", ans);
    }
    
  • 相关阅读:
    串的模式匹配
    Linux_ch02
    Linux操作简介
    Stack&Queue
    单链表
    工作中用到的oracle字符串分割整理
    maven_spring mvc_mina_dome(实体,文件,批传)(spring mina 初学dome)
    求整数和与均值
    简单计算器
    苹果和虫子2
  • 原文地址:https://www.cnblogs.com/uid001/p/11175357.html
Copyright © 2020-2023  润新知