zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    由sqlite3入门数据库学习
    Python"八荣八耻"
    Mysql数据导出-Ubuntu
    python-open-cv 自动人脸识别安装包
    Pymysql mysqllient 那些问题!
    MySQL查询(未完结)
    Scarpy+selenium 结合使用
    Scrapy框架的使用 -- 自动跳转链接并请求
    Scrapy框架的使用
    MySQL基础
  • 原文地址:https://www.cnblogs.com/uid001/p/11175357.html
Copyright © 2011-2022 走看看