「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;
}

最新文章

  1. python基础-生成随机字符串方法
  2. 使用TFHelp解析Html
  3. rabbitmq消息队列——&quot;工作队列&quot;
  4. [转][原]openstack-kilo--issue(六)kilo版openstack的dashboard在session超时后重新登录报错解决办法
  5. 创建文本,innerHTML与createTextNode的使用
  6. css选择器权值
  7. Hibernate学习---第五节:普通组件和动态组件
  8. 基于OSGi的企业级快速开发平台(开源)
  9. 继续几道经典的js题(局部和全局变量,对象等)
  10. JSON数据解析及gson.jar包
  11. NHibernate从入门到精通系列(2)——NHibernate环境与结构体系
  12. 拆系数FFT
  13. 吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection)
  14. 使用layer的弹窗时,出现layer引入成功,触发成功,控制台无报错,但是页面无变化或者仅出现遮罩层的问题的解决思路
  15. linux常用命令:ls命令
  16. Docker系列之(四):Win10上运行Docker
  17. php 字符串 以 开头 以结尾 startWith endWith
  18. 【图像处理】Schmid滤波器
  19. Linux- systemd
  20. 优股社区logo

热门文章

  1. jQuery选择器中的特殊符号和关键字
  2. ARM CPU自动调度神经网络
  3. GPU核心技术开发
  4. JMeter定时器设置延迟与同步
  5. MongoDB学习笔记01:入门
  6. 【NX二次开发】UF_CSYS_map_point()函数,绝对坐标,工作坐标,部件之间坐标转换。
  7. 【NX二次开发】拉伸的偏置方向猜想与验证
  8. 屏蔽国内app开屏广告接口的记录
  9. 从菜鸟到大神:Java高并发核心编程(连载视频)
  10. SQL Sever提权