题解 CF1000E 【We Need More Bosses】
这道题绝不是紫题。。。
题目的意思其实是让你求一个无向无重边图的直径。
对于求直径的问题我们以前研究过树的直径,可以两遍dfs或者两边bfs解决。
对于图显然不能这样解决,因为图上两点之间的简单路径不唯一。
那怎么解决这个问题呢?
能不能把环都搞掉呢?
于是乎,我们想到了强连通分量。
因此先用tarjan缩一下点,重新建图跑一个直径就可以解决这个问题了。
AC代码如下:
3053ms 23816kb
#include<bits/stdc++.h>
using namespace std;
namespace StandardIO {
template<typename T>inline void read (T &x) {
x=;T f=;char c=getchar();
for (; c<''||c>''; c=getchar()) if (c=='-') f=-;
for (; c>=''&&c<=''; c=getchar()) x=x*+c-'';
x*=f;
}
template<typename T>inline void write (T x) {
if (x<) putchar('-'),x*=-;
if (x>=) write(x/);
putchar(x%+'');
}
}
using namespace StandardIO;
namespace Solve {
const int N=;
int n,m,bcnt,index;
vector<int>graph[N],new_graph[N];
int low[N],dfn[N],belong[N],instack[N],dis[N];
stack<int>st;
inline void tarjan (int now,int father) {
low[now]=dfn[now]=++index;
st.push(now),instack[now]=;
for (register int i=; i<graph[now].size(); ++i) {
int to=graph[now][i];
if (to==father) continue;
if (!dfn[to]) {
tarjan(to,now);
low[now]=min(low[now],low[to]);
} else if (instack[to]) {
low[now]=min(low[now],dfn[to]);
}
}
if (low[now]==dfn[now]) {
int v=-;++bcnt;
while(v!=now){
v=st.top(),st.pop();
instack[v]=,belong[v]=bcnt;
}
}
}
inline void dfs (int now,int fa) {
dis[now]=dis[fa]+;
for (register int i=; i<new_graph[now].size(); ++i) {
int to=new_graph[now][i];
if (to!=fa) dfs(to,now);
}
}
inline int diameter () {
dfs(,);
int fur=;
for (register int i=; i<=bcnt; ++i) {
if (dis[i]>dis[fur]) fur=i;
}
dfs(fur,);
int ans=;
for (register int i=; i<=bcnt; ++i) {
ans=max(ans,dis[i]);
}
return ans-;
}
inline void solve () {
read(n),read(m);
for (register int i=; i<=m; ++i) {
int x,y;
read(x),read(y);
graph[x].push_back(y);
graph[y].push_back(x);
}
for (register int i=; i<=n; ++i) {
if (!dfn[i]) tarjan(i,);
}
for (register int i=; i<=n; ++i) {
for (register int j=; j<graph[i].size(); ++j) {
int to=graph[i][j];
if (belong[i]!=belong[to]) {
new_graph[belong[i]].push_back(belong[to]);
}
}
}
write(diameter());
}
}
using namespace Solve;
int main () {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
solve();
}
题解 CF1000E 【We Need More Bosses】的更多相关文章
- [CF1000E]We Need More Bosses
题目大意:给一张无向图,要求找一对$s$和$t$,使得其路径上的割边是最多的,输出其数量. 题解:把边双缩点以后求树的直径. 卡点:无 C++ Code: #include <cstdio> ...
- cf1000E We Need More Bosses (tarjan缩点+树的直径)
题意:无向联通图,求一条最长的路径,路径长度定义为u到v必须经过的边的个数 如果把强联通分量都缩成一个点以后,每个点内部的边都是可替代的:而又因为这是个无向图,缩完点以后就是棵树,跑两遍dfs求直径即 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
随机推荐
- (转载)自定义View——弹性滑动
滑动是Android开发中非常重要的UI效果,几乎所有应用都包含了滑动效果,而本文将对滑动的使用以及原理进行介绍. 一.scrollTo与ScrollBy View提供了专门的方法用于实现滑动效果,分 ...
- 《鸟哥的Linux私房菜》笔记——02. 关于Linux
Unix 历史 1969年以前:伟大的梦想--Bell, MIT 与 GE 的「Multics」系统 1969年:Ken Thompson 的小型 file server system 1973年:U ...
- STM8S103内存详析
STM8S103的RAM有1k,0x00-0x3FF(RAM和ROM统一编址),其中0x200-0x3ff共512个字节默认为堆栈,剩余的低端512个字节又分为了Zero Page和剩余的RAM(简称 ...
- VB创建文件夹
If Dir("D:\Program Files\AutoCAD 2006\Express\", vbDirectory) = "" Then '判断文件夹是否 ...
- ProGuard常见问题及解决套路
ProGuard是一个压缩.优化和混淆Java字节码的工具,非常好用.本篇文章总结一下许多人在使用ProGuard时经常遇到的问题. 我把在使用ProGuard时经常遇到的问题分为两类,分别是导致构建 ...
- Swagger 生成 PHP API 接口文档
Swagger 生成 PHP API 接口文档 Lumen微服务生成Swagger文档 1.概况 有同学反馈写几十个接口文档需要两天的工作量, 随着多部门之间的协作越来越频繁, 维护成本越来越高, 文 ...
- 【图灵杯 E也即POJ 3368】简单的RMQ
Description 给定一个数组,其中的元素满足非递减顺序.任意给定一个区间[i,j],求其中某个元素重复出现的最大次数. Input 多组数据输入.每组数据的第一行包含两个整数n和q(1< ...
- 【转】 C# DEBUG 调试信息打印及输出详解
[转] C# DEBUG 调试信息打印及输出详解 1.debug只在[debug模式下才执行](运行按钮后面的下拉框可选) 2.debug提供了许多调试指令,如断言 System.D ...
- 利用hive源码解析sql查了哪些表哪些字段
在hiveserver2中使用了org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer对抽象语法树(AST)进行语义分析,分析的过程可以得出hive查 ...
- hadoop-12-安装ambari-agent
hadoop-12-安装ambari-agent 在所有的机器上面安装ambari-agent 1, cd /etc/yum.repos.d/vi 三个文件vi ambari.repo#VERSION ...