Cycling City CF521E
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的更多相关文章
- 「CF521E」 Cycling City
「CF521E」 Cycling City 传送门 首先你能发现这个东西一定是两个环的公共边. 最开始想的是什么如果一个点被访问过三次那它一定是公共边的某一端之类的东西,然后发现被仙人掌叉掉. 然后就 ...
- Codeforces 521 E cycling city
cf的一道题,非常有意思,题目是问图中是否存在两个点,使得这两个点之间有三条路径,而且三条路径没有公共点. 其实就是判断一下是否为仙人掌就行了,如果不是仙人掌的话肯定就存在,题目难在输出路径上,改了半 ...
- [CF]Cycling City
题目大意:给定一张无向图,问图中是否存在两个点,使得这两个点之间有三条路径,而且三条路径没有公共点. 解法: 我们可以先走出来一个环,再出环上任意一点走到另外一点.就像这样:
- Codeforces 521E - Cycling City(点双连通分量+分类讨论)
Codeforces 题面传送门 & 洛谷题面传送门 大家都是暴力找生成树然后跳路径,代码不到 50 行(暴论)的一说--好,那本蒟蒻决定提供一种代码 150 行,但复杂度也是线性的分类讨论做 ...
- URAL 1966 Cycling Roads 点在线段上、线段是否相交、并查集
F - Cycling Roads Description When Vova was in Shenzhen, he rented a bike and spent most of the ...
- Ural 1966 Cycling Roads
================ Cycling Roads ================ Description When Vova was in Shenzhen, he rented a ...
- URAL 1966 Cycling Roads 计算几何
Cycling Roads 题目连接: http://acm.hust.edu.cn/vjudge/contest/123332#problem/F Description When Vova was ...
- BZOJ 2001: [Hnoi2010]City 城市建设
2001: [Hnoi2010]City 城市建设 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1132 Solved: 555[Submit][ ...
- 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 ...
随机推荐
- 【UE4】读写 Texture 数据
创建texture 方式一 void AActor_Assignment2::TextureFromImage_Internal( const TArray<FColor>& Sr ...
- 【c++ Prime 学习笔记】第6章 函数
6.1 函数基础 函数定义包括:返回类型.函数名字.由0个或多个形参组成的列表以及函数体 通过调用运算符()来执行函数,它作用于一个表达式,该表达式是函数或函数指针.圆括号内是一个逗号隔开的实参列表, ...
- [Beta]the Agiles Scrum Meeting 7
会议时间:2020.5.21 20:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 暂无 tq 新增功能:添加.选择.展示多个评测机,对新增功能进行测试 评测部分增加 ...
- 人人都写过的5个Bug!
大家好,我是良许. 计算机专业的小伙伴,在学校期间一定学过 C 语言.它是众多高级语言的鼻祖,深入学习这门语言会对计算机原理.操作系统.内存管理等等底层相关的知识会有更深入的了解,所以我在直播的时候, ...
- 21.10.18 test
可可大神出题,四款有趣的游戏推荐,第四个好玩/se T1 loopers \(\color{green}{100}\) 考虑钦定 \(a_1,a_i\) 的位置,固定左边一坨,那么剩下的一坨的 \(\ ...
- js计算精确度丢失问题解决
(function () { var calc = { /* 函数,加法函数,用来得到精确的加法结果 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精 ...
- accept error: Too many open files
今天测试socket服务器同一时间处理多个客户端连接问题,第一次测试1000个的时候没问题,第二次测试1000个服务器accept的时候就报错了 accept error: Too many open ...
- Luogu P2467 [SDOI2010]地精部落 | 神奇的dp
题目链接 DP 题目大意:给定一个数n,求1~n这n个整数的所有排列中有多少个波动数列,将这个数量%p后输出. 什么是波动数列呢?顾名思义,就是一个大.一个小.一个大.一个小--或者是一个小.一个大. ...
- 第02课 OpenGL 多边形
你的第一个多边形: 在第一个教程的基础上,我们添加了一个三角形和一个四边形.也许你认为这很简单,但你已经迈出了一大步,要知道任何在OpenGL中绘制的模型都会被分解为这两种简单的图形.读完了这一课,你 ...
- Java 中 List 分片的 5 种方法!
前些天在实现 MyBatis 批量插入时遇到了一个问题,当批量插入的数据量比较大时,会导致程序执行报错,如下图所示: 原因是 MySQL 只能执行一定长度的 SQL 语句,但当插入的数据量较多时,会生 ...