「CF521E」 Cycling City

传送门

首先你能发现这个东西一定是两个环的公共边。

最开始想的是什么如果一个点被访问过三次那它一定是公共边的某一端之类的东西,然后发现被仙人掌叉掉。

然后就不会了。

事实上有很简洁的做法:先求出原图的任意一棵 \(\texttt{DFS}\) 树,然后对于每一条非树边,它一定与一条树上的路径构成一个环,暴力覆盖知道某一条边被经过两次即可。

根据抽屉原理可得这样的复杂度是正确的,为 \(O(n)\)。

当然我为了方便写的 \(O(n\log_2n)\)

以后遇到与环相关的问题可以往这个方向上想想。

贴代码:

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
struct edge{
int to,nex;
}e[maxn<<1];
int head[maxn],cnt=1;
void add(int a,int b){
e[++cnt]=(edge){b,head[a]};
head[a]=cnt;
}
int vis[maxn],t[maxn<<2];
int dep[maxn],fa[maxn];
void dfs(int u){
dep[u]=dep[fa[u]]+1;vis[u]=1;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(!vis[v]){
t[i]=t[i^1]=1;
fa[v]=u;
dfs(v);
}
}
}
int path[maxn],tot;
void wr(int a,int b){
path[++tot]=a;
while(a!=b){
a=fa[a];
path[++tot]=a;
}
return ;
}
void pr(){
cout<<tot<<' ';
for(int i=1;i<=tot;++i) cout<<path[i]<<' ';
cout<<'\n';tot=0;
}
int lca(int x,int y){
while(dep[x]>dep[y]) x=fa[x];
while(dep[x]<dep[y]) y=fa[y];
while(x!=y) x=fa[x],y=fa[y];
return x;
}
void print(int a,int b,int c,int d){
cout<<"YES\n";
int x=lca(b,d);
if(dep[a]>dep[c]) swap(a,c),swap(b,d);
wr(x,c);reverse(path+1,path+tot+1);pr();
wr(c,a);wr(b,x);pr();
path[++tot]=c,wr(d,x);pr();
exit(0);
}
map<pair<int,int>,pair<int,int> > mp;
void check(int a,int b){
if(dep[a]<dep[b]) swap(a,b);
int d=a;
while(d!=b){
int c=fa[d];
if(mp.count(make_pair(c,d)))
print(b,a,mp[make_pair(c,d)].first,mp[make_pair(c,d)].second);
else mp[make_pair(c,d)]=make_pair(b,a);
d=c;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m;cin>>n>>m;
for(int i=1;i<=m;++i){
int a,b;cin>>a>>b;
add(a,b),add(b,a);
}
for(int i=1;i<=n;++i)
if(!vis[i]) dfs(i);
for(int u=1;u<=n;++u)
for(int i=head[u];i;i=e[i].nex)
if(!t[i])
check(u,e[i].to),t[i]=t[i^1]=1;
cout<<"NO\n";
return 0;
}

「CF521E」 Cycling City的更多相关文章

  1. 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序

    [题目]#6395. 「THUPC2018」城市地铁规划 / City [题意]给定n个点要求构造一棵树,每个点的价值是一个关于点度的k次多项式,系数均为给定的\(a_0,...a_k\),求最大价值 ...

  2. Cycling City CF521E

    Cycling City 毒瘤题 首先建dfs树,由于是个无向图所有返祖边都是连向祖先的. 判是否有解其实很简单,只要图不是一个仙人掌就有解了. 仙人掌有关可以看这个博客 但是这道题由于要输出路径成功 ...

  3. Python后端日常操作之在Django中「强行」使用MVVM设计模式

    扫盲 首先带大家了解一下什么是MVVM模式: 什么是MVVM?MVVM是Model-View-ViewModel的缩写. MVVM是MVC的增强版,实质上和MVC没有本质区别,只是代码的位置变动而已 ...

  4. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  5. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  6. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  7. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  8. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  9. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

随机推荐

  1. Paddle Lite端侧部署

    Paddle Lite端侧部署 端侧推理引擎的由来 随着深度学习的快速发展.特别是小型网络模型的不断成熟,原本应用到云端的深度学习推理,就可以放到终端上来做,比如手机.手表.摄像头.传感器.音响,也就 ...

  2. gpgpu-sim卡分配程序设计实例分析

    gpgpu-sim卡分配程序设计实例分析 运行代码地址:https://github.com/gpgpu-sim/gpgpu-sim_distribution 一.概述 此文件包含有关安装.生成和运行 ...

  3. TVM vs TensorRT比较

    TVM vs TensorRT比较 如果理解正确的话,TensorRT和TVM会加快预测速度. TensorRT优化预测GPU和TVM优化预测几乎所有平台支持GPU,ARM,Mobile... 两者在 ...

  4. python_xlutils : python利用xlutils修改表格内容

    一.xlutils是什么 是一个提供了许多操作修改excel文件方法的库: 属于python的第三方模块 xlrd库用于读取excel文件中的数据,xlwt库用于将数据写入excel文件,修改用xlu ...

  5. centos7 配置国内yum源

    配置清华大学镜像仓库 URL:https://mirrors.cnnic.cn/ CentOS 镜像使用帮助 https://mirrors.cnnic.cn/help/centos/ 建议先备份 C ...

  6. 把HttpClient换成IHttpClientFactory之后,放心多了

    前言 关于HttpClient的使用,个人在很多场景都派上用场了,比如在Winform或后台服务中用其调用接口获取和上传数据.微服务中用其进行各服务之间的数据共享等,到目前来看,似乎还没有出现过什么问 ...

  7. 你,确定了解Java的String字符串?

    本文将描述JDK6中String.intern()是如何实现的,以及在JDK7和JDK8中对字符串池化技术做了哪些改变. String池化介绍 String池化就是把一些值相同,但是标识符不同的字符串 ...

  8. SQL中的分组之后TOPN问题

    SQL分组查询然后取每一组的前N条数据 由于SQL的不同的数据库SQL的语法有些略微不同,所以我们这里采用MySQL展示. 创建表 create table person(   id         ...

  9. .Net Core with 微服务 - Elastic APM

    上一次我们介绍了Seq日志聚合组件.这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件.APM 监控围绕对应用.服务.容器的健康监控,对接口的调用链.性能进行监控.在我们实施微服务 ...

  10. 『无为则无心』Python序列 — 24、Python序列的推导式

    目录 1.列表推导式 (1)快速体验 (2)带if的列表推导式 (3)多个for循环实现列表推导式 2.字典推导式 (1)创建一个字典 (2)将两个列表合并为一个字典 (3)提取字典中目标数据 3.集 ...