这道题绝不是紫题。。。


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

对于求直径的问题我们以前研究过树的直径,可以两遍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. js或者jq 使用cookie 时在谷歌浏览器不好使

    用js或者jq 写cookie时在谷歌浏览器上打开,cookie不能正常使用. 原因:浏览器没有开启cookie,打开cookie 就可以显示 其次,当将代码上传至服务器,再用浏览器打开时,cooki ...

  2. 优动漫PAINT-简单的树、叶教学

    如题,简单.好用:其实说的还是一个观察的事.看你是否足够细心,对于树叶的生长.枝桠和树干的关系是否了解咯. 对于这样的树枝丫和叶子完全可以使用优动漫PAINT完成,简单又快捷,软件下载:www.don ...

  3. xml中单词下面有提示下划线

    xml中单词下面有提示下划线,表示单词拼写错误或者大小写错误

  4. [AHOI2013]作业 莫队 树状数组

    #include<cmath> #include<cstdio> #include<algorithm> #include<string> #inclu ...

  5. 解决Windows下git需要每次都要ssh-add的问题

    顽皮的很: 不知道怎么回事,每次打开git提交代码都需要ssh-add一下秘钥才可以正常提交: 不然就报错权限之类的问题: 怎么才能更方便一些? 卸了重装!我没试... 再或者是在 git 的安装目录 ...

  6. React 第二天

    第二天 01 关于Vue和React中key的作用 在循环的时候一定要为组件加key 02关于jsx语法的注意事项 jsx中的注释 {/*  */} class要写成className label标签 ...

  7. C语言Huffman压缩和解压

    符号表结构体: struct node { // 字符串形式存储的Huffman编码 char code[MAX_CODE_LENGTH]; // 这个字符在文件中出现的次数 long count; ...

  8. 单机Mongo复制集安装配置(数据库版本:4.x)

      官方文档: https://docs.mongodb.com/manual/tutorial/deploy-replica-set-with-keyfile-access-control/#dep ...

  9. linux 下的小知识

    Linux中有7种启动级别 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多用户状态(没有NFS ...

  10. #error 、 #line 和 #pragma 的使用

    1. #error 的用法 (1)#error 是一种预编译器指示字,用于生成一个编译错误消息 (2)用法:#error message //注意:message 不需要用双引号包围 (3)#erro ...