cf1000E
先缩点构造出一颗树,然后求树的直径就好
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的更多相关文章
- cf1000E We Need More Bosses (tarjan缩点+树的直径)
题意:无向联通图,求一条最长的路径,路径长度定义为u到v必须经过的边的个数 如果把强联通分量都缩成一个点以后,每个点内部的边都是可替代的:而又因为这是个无向图,缩完点以后就是棵树,跑两遍dfs求直径即 ...
- [CF1000E]We Need More Bosses
题目大意:给一张无向图,要求找一对$s$和$t$,使得其路径上的割边是最多的,输出其数量. 题解:把边双缩点以后求树的直径. 卡点:无 C++ Code: #include <cstdio> ...
- 题解 CF1000E 【We Need More Bosses】
这道题绝不是紫题... 题目的意思其实是让你求一个无向无重边图的直径. 对于求直径的问题我们以前研究过树的直径,可以两遍dfs或者两边bfs解决. 对于图显然不能这样解决,因为图上两点之间的简单路径不 ...
- 边双联通分量缩点+树的直径——cf1000E
题意理解了就很好做 题意:给一张无向图,任意取两个点s,t,s->t的路径上必经边数量为k 求这样的s,t,使得k最大 #include<bits/stdc++.h> #define ...
随机推荐
- SpringBoot Jpa 自定义查询
SpringBoot Jpa 自定义查询 持久层Domain public interface BaomingDao extends JpaRepository<BaomingBean,Inte ...
- C++用rand()和srand()生成随机数
内容来自<编程实战宝典> 首先来看函数原型 int rand(void); void srand(unsigned int seed); 1.rand()函数不需要任何参数,直接返回一个随 ...
- 实验楼-python3简明教程笔记
#!/usr/bin/env python3 days = int(input("Enter days: ")) print("Months = {} Days = {} ...
- XLNet:运行机制及和Bert的异同比较
这两天,XLNet貌似也引起了NLP圈的极大关注,从实验数据看,在某些场景下,确实XLNet相对Bert有很大幅度的提升.就像我们之前说的,感觉Bert打开两阶段模式的魔法盒开关后,在这条路上,会有越 ...
- ORB-SLAM2 论文&代码学习 ——Tracking 线程
本文要点: ORB-SLAM2 Tracking 线程 论文内容介绍 ORB-SLAM2 Tracking 线程 代码结构介绍 写在前面 上一篇文章中我们已经对 ORB-SLAM2 系统有了一个概览性 ...
- Mysql 在线新建或重做主从
1. 前言 以前给 Mysql 数据库做主从,都是在主服务器停服的情况下做的.但是最近有一个项目,已经上线几天了,数据库也单服务器跑了几天,才确定要给 Mysql 服务器做一个主从架构,简单的一主一从 ...
- Nginx之常用基本配置
上一篇博客我们大概介绍了一下nginx,nginx的架构,nginx编译安装和nginx命令的用法,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/1236680 ...
- TChart-图表的滚动与翻译
界面代码: object Form1: TForm1 Left = Top = Width = Height = Caption = 'Form1' Color = clBtnFace Font.Ch ...
- Android进程调度之adj算法
copy from : http://gityuan.com/2016/08/07/android-adj/ 一.概述 提到进程调度,可能大家首先想到的是Linux cpu调度算法,进程优先级之类概念 ...
- vue中keepalive怎么理解?---vue中文社区
vue中keepalive怎么理解? 说在前面: keep-alive是vue源码中实现的一个组件, 感兴趣的可以研究源码 https://github.com/vuejs/vue/blob/dev/ ...