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

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. [信息安全] 05 X.509 公钥证书的格式标准

    X.509是# 公钥证书的格式标准, 广泛用于TLS/SSL安全通信或者其他需要认证的环境中.X.509证书可以由# CA颁发,也可以自签名产生. 1 Overview {#1-overview} X ...

  2. USBWebServer - 在U盘里搭一个Web服务器!

    文章选自我的博客:https://blog.ljyngup.com/archives/321.html/ 本文将介绍一款可以在U盘内直接搭建Web服务器的软件 软件可以免安装直接在U盘内运行,适合外出 ...

  3. [redis读书笔记] 第二部分 单机数据库 RDB持久化

    内存中的rdb是会存为文件以做到RDB持久化的.RDB文件时一个二进制文件. 一 载入与存储 文件的载入是在server启动时进行的(rdbload()),因为AOF的更新频率比RDB高,所以如果AO ...

  4. javascript get set读取器

    class Person{ constructor(name, id){ let _name = name, _id = id; Object.defineProperties(this, { nam ...

  5. 小记centos7.5下yum安装cobbler遇到的问题

    问题1:执行cobbler sync同步命令报错,提示dhcpd服务错误和Python源码错误 [root@server ~]# cobbler sync #<===执行cobbler同步的时候 ...

  6. React之深入了解虚拟DOM

    JS在手机中也可运行,React Native通过将虚拟DOM转换为底层的原生组件,即可在手机端运行,在浏览器运行时,只需要将虚拟DOM转换为真实DOM即可运行,虚拟DOM就是将真实DOM转换为JS对 ...

  7. JS生成全局唯一标识符(GUID,UUID)的方法

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...

  8. vs工程配置eslint检测环境

    vs工程打开一个js文件,会提示 "No ESLint configuration (e.g .eslintrc) found for file ......." 或 " ...

  9. A——奇怪的玩意(POJ1862)

      题目: 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板菌落.大部分的时间stripies在移动.当他 ...

  10. C#_.net core 3.0自定义读取.csv文件数据_解决首行不是标题的问题_Linqtocsv改进

    linqtocsv文件有不太好的地方就是:无法设置标题的行数,默认首行就是标题,这不是很尴尬吗?   并不是所有的csv文件严格写的首行是标题,下面全是数据,我接受的任务就是读取很多.csv报表数据, ...