这道题绝不是紫题。。。


题目的意思其实是让你求一个无向无重边图的直径。

对于求直径的问题我们以前研究过树的直径,可以两遍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】的更多相关文章

  1. [CF1000E]We Need More Bosses

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

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

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

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  7. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  8. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

随机推荐

  1. (转载)自定义View——弹性滑动

    滑动是Android开发中非常重要的UI效果,几乎所有应用都包含了滑动效果,而本文将对滑动的使用以及原理进行介绍. 一.scrollTo与ScrollBy View提供了专门的方法用于实现滑动效果,分 ...

  2. 《鸟哥的Linux私房菜》笔记——02. 关于Linux

    Unix 历史 1969年以前:伟大的梦想--Bell, MIT 与 GE 的「Multics」系统 1969年:Ken Thompson 的小型 file server system 1973年:U ...

  3. STM8S103内存详析

    STM8S103的RAM有1k,0x00-0x3FF(RAM和ROM统一编址),其中0x200-0x3ff共512个字节默认为堆栈,剩余的低端512个字节又分为了Zero Page和剩余的RAM(简称 ...

  4. VB创建文件夹

    If Dir("D:\Program Files\AutoCAD 2006\Express\", vbDirectory) = "" Then '判断文件夹是否 ...

  5. ProGuard常见问题及解决套路

    ProGuard是一个压缩.优化和混淆Java字节码的工具,非常好用.本篇文章总结一下许多人在使用ProGuard时经常遇到的问题. 我把在使用ProGuard时经常遇到的问题分为两类,分别是导致构建 ...

  6. Swagger 生成 PHP API 接口文档

    Swagger 生成 PHP API 接口文档 Lumen微服务生成Swagger文档 1.概况 有同学反馈写几十个接口文档需要两天的工作量, 随着多部门之间的协作越来越频繁, 维护成本越来越高, 文 ...

  7. 【图灵杯 E也即POJ 3368】简单的RMQ

    Description 给定一个数组,其中的元素满足非递减顺序.任意给定一个区间[i,j],求其中某个元素重复出现的最大次数. Input 多组数据输入.每组数据的第一行包含两个整数n和q(1< ...

  8. 【转】 C# DEBUG 调试信息打印及输出详解

    [转] C# DEBUG 调试信息打印及输出详解 1.debug只在[debug模式下才执行](运行按钮后面的下拉框可选) 2.debug提供了许多调试指令,如断言          System.D ...

  9. 利用hive源码解析sql查了哪些表哪些字段

    在hiveserver2中使用了org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer对抽象语法树(AST)进行语义分析,分析的过程可以得出hive查 ...

  10. hadoop-12-安装ambari-agent

    hadoop-12-安装ambari-agent 在所有的机器上面安装ambari-agent 1, cd /etc/yum.repos.d/vi 三个文件vi ambari.repo#VERSION ...