题解 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 ...
随机推荐
- 逮住一个bug
首先我们要找找自己有没有玩过论坛,如果玩过的话是不是一个discuz! x的论坛. 然后执行如下代码: location.href=((d=(await(await fetch("./hom ...
- js 40 个技巧
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...
- 推荐几个bootstrap 后端UI框架
转载地址 https://blog.csdn.net/u013816448/article/details/81563051
- STM8S103之独立看门狗和窗口看门狗
独立看门狗时钟来源为LSI:窗口看门狗时钟来源为CPU: 窗口看门狗窗口的含义是:喂狗必须在一定的窗口期内完成,不能过早也不能过晚. 总结:防止程序复位,用独立看门狗. 独立看门狗使用的流程:参见库函 ...
- lftp简单使用
连接服务器: lftp -e "参数;" "username":"password"@"ip" -p port lftp ...
- ActiveMQ学习笔记(9)----ActiveMQ静态网络连接
1. 启动多个Broker 在win10下同一台服务器启动多个Broker, 步骤如下: 1. 复制安装目录下的conf文件夹命名为conf2 2. 修改activemq.xml中的brokerNam ...
- 3ds Max做的卡通狗教程
使用软件::3ds Max 软件下载:http://www.xy3dsmax.com/xiazai.html 全教程完,学完记得交作业.如果本教程对您有所帮助,请推荐给你的朋友.
- 3dmax快速实现一个逼真地毯效果
3dsmax怎么制作逼真的毛绒地毯模型?3dsmax中想要中想要建模长方形的毛绒地毯,该怎么制作呢?下面我们就来看看详细的教程,需要的朋友可以参考下: 1.在创建面板-扩展基本体下选择切角长方体 2. ...
- 网页结构的简介和Xpath语法的入门教程
相信很多小伙伴已经听说过Xpath,之前小编也写过一篇关于Xpath的文章,感兴趣的小伙伴可以戳这篇文章如何利用Xpath抓取京东网商品信息以及Python网络爬虫四大选择器(正则表达式.BS4.Xp ...
- axios的坑
1.axios默认发送application/json 格式 https://www.cnblogs.com/qdcnbj/p/8143155.html 资料: https://www.npmjs.c ...