[JZOJ 5465] [NOIP2017提高A组冲刺11.9] 道路重建 解题报告 (e-dcc+树的直径)
题目链接:
http://172.16.0.132/senior/#main/show/5465
题目:
小X所居住的X国共有n个城市,有m条无向道路将其连接。作为一个统一的国家,X 城的任意两个城市都可以相互到达。
由于X国正处于地震带上,有时X国中会有至多一条道路发生毁坏,无法使用。如果这条道路的毁坏恰好阻断了某些城市的往来,那么我们称这条道路是危险的。
人们并不喜欢危险的道路,于是人们决定重建恰好一条道路,以减少危险的道路数。请告诉人们,重建恰好一条道路后,危险的道路数最少是多少。
题解:
显然在一个边双里,任意删掉一条边依旧是连通的,也就是说危险的道路其实就是桥
因此我们缩边双,建新图
注意到缩掉所有的边双之后图会变成一棵树,我们就是要在这棵树连边,使得上形成的环最大,环上的边本来是危险的,现在不危险了
显然我们要连的是直径的两个端点,求一遍树的直径就好了
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<time.h>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std; const int N=2e5+;
const int M=1e6+;
int n,m,tot1,tot2,tim,tp,mx,pos;
int h1[N],h2[N],dfn[N],vis[N],belong[N],low[N];
bool brige[M<<];
struct E{
int to,nxt;
}e1[M<<],e2[M<<];
inline char nc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
char ch=nc();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=nc();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=nc();}
return s*f;
}
void link1(int u,int v){e1[++tot1]=(E){v,h1[u]};h1[u]=tot1;}
void link2(int u,int v){e2[++tot2]=(E){v,h2[u]};h2[u]=tot2;}
void chkmin(int &x,int y){if (y<x) x=y;}
void init(){
mem(h1,);mem(h2,);mem(dfn,);mem(low,);mem(brige,);
tot1=tot2=;
tim=tp=;
}
void tarjan(int x,int pre){
dfn[x]=low[x]=++tim;
for (int i=h1[x];i;i=e1[i].nxt){
int y=e1[i].to;
if (!dfn[y]){
tarjan(y,i);
chkmin(low[x],low[y]);
if (low[y]>dfn[x]) brige[i]=brige[i^]=;
}
else if (i!=(pre^)) chkmin(low[x],dfn[y]);
}
}
void dfs(int x,int edcc){
belong[x]=edcc;vis[x]=;
for (int i=h1[x],y;i;i=e1[i].nxt){
if (vis[y=e1[i].to]||brige[i]) continue;
dfs(y,edcc);
}
}
void dfs1(int x,int len,int pre){
if (len>mx) mx=len,pos=x;
for (int i=h2[x],y;i;i=e2[i].nxt){
if ((y=e2[i].to)==pre) continue;
dfs1(y,len+,x);
}
}
int main(){
freopen("rebuild.in","r",stdin);
freopen("rebuild.out","w",stdout);
while ()
{
n=read();m=read();
if (!n&&!m) break;
init();
for (int i=,u,v;i<=m;i++){
u=read();v=read();link1(u,v);link1(v,u);
}
tarjan(,-);
mem(vis,);
int cnt=;
for (int i=;i<=n;i++) if (!vis[i]) dfs(i,++cnt);
for (int x=;x<=n;x++)
for (int i=h1[x];i;i=e1[i].nxt){
int y=e1[i].to;
if (belong[x]==belong[y]) continue;
link2(belong[x],belong[y]);
}
mx=;
dfs1(,,-);
mx=;
dfs1(pos,,-);
printf("%d\n",cnt-mx);
}
return ;
}
[JZOJ 5465] [NOIP2017提高A组冲刺11.9] 道路重建 解题报告 (e-dcc+树的直径)的更多相关文章
- JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章
5462. [NOIP2017提高A组冲刺11.8]好文章 (File IO): input:article.in output:article.out Time Limits: 1000 ms M ...
- JZOJ 5456. 【NOIP2017提高A组冲刺11.6】奇怪的队列
5456. [NOIP2017提高A组冲刺11.6]奇怪的队列 (File IO): input:queue.in output:queue.out Time Limits: 1000 ms Mem ...
- JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室
5459. [NOIP2017提高A组冲刺11.7]密室 (File IO): input:room.in output:room.out Time Limits: 1000 ms Memory L ...
- JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线
455. [NOIP2017提高A组冲刺11.6]拆网线 (File IO): input:tree.in output:tree.out Time Limits: 1000 ms Memory L ...
- JZOJ 5461. 【NOIP2017提高A组冲刺11.8】购物
5461. [NOIP2017提高A组冲刺11.8]购物 (File IO): input:shopping.in output:shopping.out Time Limits: 1000 ms ...
- 5458. 【NOIP2017提高A组冲刺11.7】质数
5458. [NOIP2017提高A组冲刺11.7]质数 (File IO): input:prime.in output:prime.out Time Limits: 1000 ms Memory ...
- [JZOJ5455]【NOIP2017提高A组冲刺11.6】拆网线
Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...
- 【NOIP2017提高A组冲刺11.8】好文章
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> us ...
- 【NOIP2017提高A组冲刺11.6】拆网线
和syq大兄弟吐槽题目不小心yy出了正解.. 最优的选法就是选两个两个相互独立的,欸这不就是最大匹配吗?那多的企鹅就新加一条边呗?不够的就除以2上取整呗? 欸?AC了? 树也是一个二分图,最大匹配=最 ...
随机推荐
- 0x28 IDA*
一个早上做完了我真牛B 就是A*用于DFS啊,现在我才发现迭代加深真是个好东西. poj3460 %了%了我们的目标是把它的顺序变对,那么第i个位置的值+1是要等于第i+1个位置的值的.对于一个操作, ...
- 【SDOI 2016】 排列计数
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4517 [算法] 有m个数在原来的位置上,说明有(n-m)个数不再原来的位置上 那么, ...
- python初始面向对象
阅读目录 楔子 面向过程vs面向对象 初识面向对象 类的相关知识 对象的相关知识 对象之间的交互 类命名空间与对象.实例的命名空间 类的组合用法 初识面向对象小结 面向对象的三大特性 继承 多态 封装 ...
- Rsync 服务器搭建
Rsync简介 rsync 是一个 Unix 系统下的文件同步和传输工具. 它具备以下特性: 1. 能更新整个目录和树和文件系统 2. 有选择性的保持符号链链.硬链接.文件属于.权限.设备以及时间 等 ...
- jquery分页点击后页面置顶
前台: <a href="#" ><span id='top'></span></a> js中: 放在分页事件后,数据加载完成后 j ...
- Axure设计软件下载安装及注册
如图:本地计算机安装了两个版本的Axure,但8版的有问题,点击保存软件就退出了:7版本要想使用的注册授权 https://blog.csdn.net/botree_chan/article/deta ...
- MySQL高级查询和编程基础
第一章 数据库设计 一.数据需求分析: 数据需求分析是为后续概念设计和逻辑结构设计做准备. 结构:(1)对现实世界要处理的对象进行详细的调查. (2)收集基础数.据. (3)对所收集的数据进行处理. ...
- 多年js学习累计总结
http://www.codesec.net/list/6/ 大神http://www.cnblogs.com/tylerdonet/p/5543813.html
- day07 分支,循环
目录 if(分支) if的语法 if...else... if...elif...else if的嵌套 for循环 for-else 语句 for循环的嵌套(重要) range介绍 while循环 w ...
- webpack——entry,output,plugins,loader,chunk知识
entry:打包入口 代码的入口,找到依赖模块 打包的入口,webpack去哪个文件找依赖,或是去那个文件依赖的依赖 可以是一个或者多个入口 例如: 1.module.exports={ entry: ...