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. HttpRunner3.X - 实现参数化驱动

    一.前言 HttpRunner3.X支持三种方式的参数化,参数名称的定义分为两种情况: 独立参数单独进行定义: 多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)进行连接. 数据源指定支持三 ...

  2. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  3. [技术博客]OKhttp3使用get,post,delete,patch四种请求

    OKhttp3使用get,post,delete,patch四种请求 1.okhttp简介 okhttp封装了大量http操作,大大简化了安卓网络请求操作,是现在最火的安卓端轻量级网络框架.如今okh ...

  4. [no code][scrum meeting] Alpha 2

    项目 内容 会议时间 2020-04-07 会议主题 功能规格说明书review 会议时长 30min 参会人员 OCR组(肖思炀,赵涛)和产品经理 $( "#cnblogs_post_bo ...

  5. BUAA2020软工作业(五)——软件案例分析

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面 ...

  6. 关于string转换为wstring问题

    方法一:需要调用windows的api函数进行转换,在vs2017上试验转换成功 #ifdef _MSC_VER #include <Windows.h> #endif // _MSC_V ...

  7. f(sinx)到底是啥

    总结一句:cosx是偶次就一定可以用.

  8. hdu 1069 Monkey and Banana(记忆搜)

    题意: N(不超过30)种木块,每种木块有长.宽.高x,y,z. 木块A可以搭在木块B上当且仅当A的底面长和宽都分别小于B的顶面的长与宽,即不能有超出B的部分. 问垒起来的"木块塔" ...

  9. poj 1330 Nearest Common Ancestors (最简单的LCA)

    题意: 给出一棵树的结构. 给出两个点X和Y,求它俩的LCA. 思路: 只需求两个点的LCA,用了两种方法,一种离线tarjan,一种直接搞. 看代码. 代码: 方法一:直接搞. int const ...

  10. 一、安装zabbix监控(源码编方式)

    首先介绍一下zabbix的运行原理和运行条件. Zabbix监控原理 Zabbix 通过C/S 模式采集数据,通过B/S模式在web 端展示和配置.  被监控端:主机通过安装agent 方式采集数据, ...