Cycling City

毒瘤题

首先建dfs树,由于是个无向图所有返祖边都是连向祖先的。

判是否有解其实很简单,只要图不是一个仙人掌就有解了。

仙人掌有关可以看这个博客

但是这道题由于要输出路径成功变成了一个一个顶俩的题。。。。。

通过判仙人掌我们确认了一个点,它连向自己父亲的路径至少被两个边所覆盖。

然后我们可以从这个点开始深搜,找到这两个返祖,注意是返向这个点祖先的路径。

于是有起点就是这两个路径下端的lca,终点就是这两个路径上端点最深的一个(画图很好看出来的)

然后有哪些路径就显然了。。

输出方案毒瘤!

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
#define MAXN 201116
#define pb push_back
#define pii pair<int,int>
#define mp make_pair
int n , m;
vector<int> G[MAXN];
int dep[MAXN] , par[MAXN] , dir[MAXN];
void dfs( int u , int fa ) {
dep[u] = dep[fa] + 1 , par[u] = fa;
for( int i = 0 ; i < G[u].size( ) ; ++ i ) {
int v = G[u][i];
if( v == fa ) continue;
if( !dep[v] ) dfs( v , u ) , dir[u] += dir[v];
else if( dep[v] < dep[u] )
++ dir[u] , -- dir[ v ];
}
}
int l , r , L , R;
int s;
void dfs2( int u , int fa ) {
for( int i = 0 ; i < G[u].size() ; ++ i ) {
int v = G[u][i];
if( dep[v] == dep[u] + 1 ) dfs2( v , u );
else if( dep[v] < dep[s] && v != fa ) {
if( l ) L = u , R = v;
else l = u , r = v;
}
if( L ) return;
}
}
vector<int> ans , tmp;
void doit( int fr , int to ) {
if( dep[fr] < dep[to] ) {
tmp.clear();
to = par[to];
while( to != fr )
tmp.pb( to ) , to = par[to];
tmp.pb( fr );
for( auto it = tmp.rbegin() ; it != tmp.rend( ) ; ++ it )
ans.pb( *it );
return;
}
while( fr != to )
ans.pb( fr ) , fr = par[fr];
}
int main() {
cin >> n >> m;
for( int i = 1 , u , v ; i <= m ; ++ i ) {
scanf("%d%d",&u,&v);
G[u].pb( v ) , G[v].pb( u );
}
for( int i = 1 ; i <= n ; ++ i ) if( !dep[i] ) dfs( i , 0 );
for( int i = 1 ; i <= n ; ++ i ) if( dir[i] > 1 )
{ s = i; break; }
if( !s ) return puts("NO") , 0;
puts("YES");
dfs2( s , par[s] );
if( dep[R] < dep[r] ) swap( r , R ) , swap( l , L );
int x = l , y = L;
while( x != y ) dep[x] > dep[y] ? x = par[x] : y = par[y]; doit( x , l ) , ans.pb( l ) , doit( r , R ) , ans.pb( R );
printf("%d ",ans.size());
for( auto& x : ans ) printf("%d ",x);
puts(""); ans.clear();
doit( x , L ) , ans.pb( L ) , ans.pb( R );
printf("%d ",ans.size());
for( auto& x : ans ) printf("%d ",x);
puts(""); ans.clear();
doit( x , R ) , ans.pb( R );
printf("%d ",ans.size());
for( auto& x : ans ) printf("%d ",x);
puts(""); }

Cycling City CF521E的更多相关文章

  1. 「CF521E」 Cycling City

    「CF521E」 Cycling City 传送门 首先你能发现这个东西一定是两个环的公共边. 最开始想的是什么如果一个点被访问过三次那它一定是公共边的某一端之类的东西,然后发现被仙人掌叉掉. 然后就 ...

  2. Codeforces 521 E cycling city

    cf的一道题,非常有意思,题目是问图中是否存在两个点,使得这两个点之间有三条路径,而且三条路径没有公共点. 其实就是判断一下是否为仙人掌就行了,如果不是仙人掌的话肯定就存在,题目难在输出路径上,改了半 ...

  3. [CF]Cycling City

    题目大意:给定一张无向图,问图中是否存在两个点,使得这两个点之间有三条路径,而且三条路径没有公共点. 解法: 我们可以先走出来一个环,再出环上任意一点走到另外一点.就像这样:

  4. Codeforces 521E - Cycling City(点双连通分量+分类讨论)

    Codeforces 题面传送门 & 洛谷题面传送门 大家都是暴力找生成树然后跳路径,代码不到 50 行(暴论)的一说--好,那本蒟蒻决定提供一种代码 150 行,但复杂度也是线性的分类讨论做 ...

  5. URAL 1966 Cycling Roads 点在线段上、线段是否相交、并查集

    F - Cycling Roads     Description When Vova was in Shenzhen, he rented a bike and spent most of the ...

  6. Ural 1966 Cycling Roads

    ================ Cycling Roads ================   Description When Vova was in Shenzhen, he rented a ...

  7. URAL 1966 Cycling Roads 计算几何

    Cycling Roads 题目连接: http://acm.hust.edu.cn/vjudge/contest/123332#problem/F Description When Vova was ...

  8. BZOJ 2001: [Hnoi2010]City 城市建设

    2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1132  Solved: 555[Submit][ ...

  9. History lives on in this distinguished Polish city II 2017/1/5

    原文 Some fresh air After your time underground,you can return to ground level or maybe even a little ...

随机推荐

  1. 华为在HDC2021发布全新HMS Core 6 宣布跨OS能力开放

    [2021年10月22日·东莞]华为开发者大会 2021(Together)于今天正式开幕,华为在主题演讲中正式发布全新的HMS Core 6,向全球开发者开放7大领域的69个Kit和21,738个A ...

  2. AIApe问答机器人项目Scrum Meeting博客汇总

    荡起双桨 Scrum Meeting 博客汇总 一.Alpha阶段 AIApe问答机器人Scrum Meeting 4.23 AIApe问答机器人Scrum Meeting 4.25 AIApe问答机 ...

  3. 2020BUAA软工热身作业

    2020BUAA软工热身作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 热身作业 我在这个课程的目标是 学习软件工 ...

  4. 莱特币(LTC)开发环境搭建

    Linux系统下搭建莱特币LTC开发环境 1.简介 2.LTC 客户端下载 3.解压到一个固定的目录中 4.启动客户端 4.1.参数解释: 4.2.更多详细的配置 5.执行命令测试一下 6.获取莱特币 ...

  5. Zabbix 5.0:监控阿里云RDS

    Blog:博客园 个人 由于近期压测,需要频繁登录阿里云查看RDS监控,每次登录查看监控步骤较为繁琐,故将监控接入到zabbix. 概述 由于阿里云已做了RDS的监控,我们只需要通过阿里云SDK把这些 ...

  6. Java 16 新功能介绍

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 程序猿阿朗博客 已经收录,有很多知识点和系列文章. Ja ...

  7. Python import cStringIO ImportError: No module named 'cStringIO'

    From Python 3.0 changelog; The StringIO and cStringIO modules are gone. Instead, import the io modul ...

  8. cf Two Sets (我用二分最大匹配做的)

    题意: n个数p1,p2....pn     两个数a,b 把它们分成A,B两个集合. 若x属于A,a-x一定属于A. 若x属于B,b-x一定属于B. 问是否可能将这n个数分成两个集合.若可以,输出每 ...

  9. ELK集群之kibana(4)

    kibane安装及基础使用 Kibana的安装 Kibana包含前端展示.es操作简化 yum localinstall kibana-7.6.2-x86_64.rpm -y Kibana配置修改ki ...

  10. Invalid prop: type check failed for prop "xxx". Expected Number, got String.

    在子组件progress-circle.vue的template中的定义如下: <svg :width="radius" :height="radius" ...