先缩点构造出一颗树,然后求树的直径就好

const int maxn=3e5+5;
const int maxm=6e5+5;
const int inf=1e9; int head[maxn],ver[maxm],nex[maxm],tot; void inline AddEdge(int x,int y){
ver[++tot]=y,nex[tot]=head[x],head[x]=tot;
} int n,m; bool bridge[maxm]; int dfn[maxn],low[maxn]; int num; void Tarjan(int x,int edge){
//cout<<x<<endl;
dfn[x]=low[x]=++num;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(!dfn[y]){
Tarjan(y,i);
low[x]=min(low[x],low[y]);
if(low[y]>dfn[x])
bridge[i]=bridge[i^1]=1;
}
else if(i!=(edge^1))
low[x]=min(low[x],dfn[y]);
}
} int id[maxn],bcc; namespace solve{
int head[maxn],ver[maxm],nex[maxm],tot; void inline AddEdge(int x,int y){
ver[++tot]=y,nex[tot]=head[x],head[x]=tot;
} int f1[maxn],f2[maxn]; int ans; int dfs(int x,int pa){
f1[x]=f2[x]=0;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(y==pa) continue;
dfs(y,x);
if(f1[x]<f1[y]+1){
f2[x]=f1[x];
f1[x]=f1[y]+1;
}
else if(f2[x]<f1[y]+1){
f2[x]=f1[y]+1;
}
}
ans=max(ans,f1[x]+f2[x]);
return ans;
} }; void dfs(int x,int pa){
id[x]=bcc;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(y==pa || bridge[i] || id[y]) continue;
dfs(y,pa);
}
}
int main(){
scanf("%d%d",&n,&m);
tot=1;
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
AddEdge(x,y);
AddEdge(y,x);
}
for(int i=1;i<=n;i++)
if(!dfn[i]) Tarjan(i,0);
// for(int i=1;i<=n;i++)
// cout<<low[i]<<' '<<i<<endl;
for(int i=1;i<=n;i++)
if(!id[i]) bcc++,dfs(i,0);
// cout<<bcc<<endl;
// for(int i=1;i<=n;i++)
// cout<<id[i]<<endl;
for(int i=2;i<=tot;i+=2){
if(bridge[i]) {
solve::AddEdge(id[ver[i]],id[ver[i^1]]);
solve::AddEdge(id[ver[i^1]],id[ver[i]]);
// cout<<id[ver[i]]<<' '<<id[ver[i^1]]<<endl;
}
}
cout<<solve::dfs(1,0)<<endl;
}

  

cf1000E的更多相关文章

  1. cf1000E We Need More Bosses (tarjan缩点+树的直径)

    题意:无向联通图,求一条最长的路径,路径长度定义为u到v必须经过的边的个数 如果把强联通分量都缩成一个点以后,每个点内部的边都是可替代的:而又因为这是个无向图,缩完点以后就是棵树,跑两遍dfs求直径即 ...

  2. [CF1000E]We Need More Bosses

    题目大意:给一张无向图,要求找一对$s$和$t$,使得其路径上的割边是最多的,输出其数量. 题解:把边双缩点以后求树的直径. 卡点:无 C++ Code: #include <cstdio> ...

  3. 题解 CF1000E 【We Need More Bosses】

    这道题绝不是紫题... 题目的意思其实是让你求一个无向无重边图的直径. 对于求直径的问题我们以前研究过树的直径,可以两遍dfs或者两边bfs解决. 对于图显然不能这样解决,因为图上两点之间的简单路径不 ...

  4. 边双联通分量缩点+树的直径——cf1000E

    题意理解了就很好做 题意:给一张无向图,任意取两个点s,t,s->t的路径上必经边数量为k 求这样的s,t,使得k最大 #include<bits/stdc++.h> #define ...

随机推荐

  1. linux入门系列11--Centos7网络服务管理

    通过前面文章的学习已经掌握了Linux系统配置管理的知识,本文讲解Centos7网络配置知识. Linux要对外提供服务,需要保证网络通信正常,因此需要正确配置网络参数.本文将讲解如何使用Networ ...

  2. 《Head First Java(第二版)》中文版 分享下载

    书籍信息 书名:<Head First Java(第二版)>中文版 作者: Kathy Sierra,Bert Bates 著 / 杨尊一 编译 张然等 改编 豆瓣评分:8.7分 内容简介 ...

  3. Linux相关知识笔记

    Quagga要在linux下编译并配置运行,所有,学习一点linux的基础知识. 安装的Ubuntu,用户名linux,密码1 使能Ubuntu的IP转发功能,需要修改etc/sysctl.conf和 ...

  4. Apache 容器 Directory Location Files 及htaccess文件

    配置段容器的类型 相关模块 core mod_proxy 相关指令 <Directory> <DirectoryMatch> <Files> <FilesMa ...

  5. linux系统的启动流程梳理

    1. 不同版本的linux系统的启动流程 1.1 centos6.x系统的启动流程 其详细启动步骤如下: 1)开机,BIOS自检,检查各个硬件是否正常 2)读取硬盘MBR信息,引导系统启动 3)加载g ...

  6. Lua类的继承 参考实现

    参考url: https://blog.codingnow.com/cloud/LuaOO 最近在思考lua类的继承实现 ,参考了云风的类实现,感觉他的更像是接口写法.于是尝试用自己的方式重写了类实例 ...

  7. redis系列-开篇

    0x0 缘起 笔者所在的公司有一款大DAU(日活)的休闲游戏.这款游戏的后端架构很简单,可以简单理解为通讯-逻辑-存储三层结构.其中存储层大量使用了redis和mysql. 虽然存量用户的增加,red ...

  8. MYSQL使用group by,如何查询出总记录数

    比如有这样一条SQL,根据t.user_id,t.report_date两个字段统计 这样前端页面能展示数据,但往往需要一个总记录数,在有分页的情况下用到 一种解决方法是在外面套一层,然后对其coun ...

  9. Windows CMD 输出文本到文件,不加换行符

    >test.txt set /p="Hello" <nul >>test.txt set /p=" world!" <nul 正文 ...

  10. Django3的安装以及web项目的创建

    cmd 直接输入:pip install -i https://pypi.douban.com/simple django 2.检测是否安装成功:用到的命令:import  django  ,检测版本 ...