cf的一道题,非常有意思,题目是问图中是否存在两个点,使得这两个点之间有三条路径,而且三条路径没有公共点。

其实就是判断一下是否为仙人掌就行了,如果不是仙人掌的话肯定就存在,题目难在输出路径上,改了半天也不对,借鉴了一个dalao的代码。感觉非常神奇。

首先是判断是否为仙人掌,利用返祖边即可,如果一条树边被两条或者以上的返祖边覆盖,那么图就肯定不是一个仙人掌,利用差分可以实现。

然后是输出路径,找到一个被覆盖了两次的边,那么两条返祖边一定跨过了这个边,往上往下搜索就行了,找到了两条返祖边。那么路径就出来了,一条毫无疑问是树边,一直网上蹦就行了。

另外两个就是返祖边,那么问题来了,起点在哪?因为路径不能有交点(我们设深度小的为起点,深度大的为终点),那么终点一定是两条返祖边的下面端点的lca(这样很明显两个通过返祖边走上去的路径没有交点,而且这两条路径不会沿着树边往上走,他们可以往下走然后沿着非树边跳上去到起点,这样就不会和树边那条路径有交点了),起点就是两条返祖边上面端点中比较深的一个点,因为如果是比较浅的那个点的话,会和树边上的路径有交点。

那么我们就做完了,附上代码。——by VANE

#include<bits/stdc++.h>
using namespace std;
const int N=;
int dep[N],fa[N],f[N];
int n,m,l1,l2,r1,r2,s,t,x,y;
vector<int> e[N];
void dfs(int x,int father)
{
dep[x]=dep[father]+;
fa[x]=father;
for(int i=;i<e[x].size();++i)
if(!dep[e[x][i]]) dfs(e[x][i],x);
else if(dep[e[x][i]]<dep[x]&&e[x][i]!=father)
--f[e[x][i]],++f[x];
f[father]+=f[x];
}
void DFS(int x)
{
for(int i=;i<e[x].size();++i)
if(dep[e[x][i]]==dep[x]+)
{
DFS(e[x][i]);
if(l2) return;
}
else if(dep[e[x][i]]<dep[s]&&e[x][i]!=fa[x])
{
if(l1) r2=x,l2=e[x][i];
else r1=x,l1=e[x][i];
if(l2) return;
}
}
int d[N];
void go(int l,int r)
{
int k=t;t+=abs(dep[r]-dep[l])+;
if(dep[l]>dep[r])
for(int i=l,j=k+;j<=t;i=fa[i],++j) d[j]=i;
else
for(int i=r,j=t;j>k;i=fa[i],--j) d[j]=i;
}
void print()
{
printf("%d ",t);
for(int i=;i<=t;++i) printf("%d ",d[i]);puts("");
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
e[a].push_back(b);
e[b].push_back(a);
}
for(int i=;i<=n;++i) if(!dep[i]) dfs(i,);
for(int i=;i<=n;++i)
if(f[i]>) {s=i;break;}
if(!s) {puts("NO");return ;}
DFS(s);
puts("YES");
if(dep[l1]>dep[l2]) swap(l1,l2),swap(r1,r2);
for(x=r1,y=r2;x!=y;)
dep[x]>dep[y]?x=fa[x]:y=fa[y];
t=;go(x,r1);go(l1,l2);print();
t=;go(x,r2);go(l2,l2);print();
t=;go(x,l2);print();
return ;
}

Codeforces 521 E cycling city的更多相关文章

  1. 「CF521E」 Cycling City

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

  2. Cycling City CF521E

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

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

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

  4. CodeForces 821D Okabe and City

    Okabe and City 题解: 将行和列也视为一个点. 然后从普通的点走到行/列的点的话,就代表这行/列已经被点亮了. 然后将费用为0的点建上边. 注意讨论(n,m)非亮的情况下. 代码: #i ...

  5. codeforces B. Strongly Connected City(dfs水过)

    题意:有横向和纵向的街道,每个街道只有一个方向,垂直的街道相交会产生一个节点,这样每个节点都有两个方向, 问是否每一个节点都可以由其他的节点到达.... 思路:规律没有想到,直接爆搜!每一个节点dfs ...

  6. [CF]Cycling City

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

  7. 专题:CF图论杂题

    题目是来自HZW的博客(构造题我是各种不会...) Solved 1 / 1 A CodeForces 500A New Year Transportation Solved 1 / 1 B Code ...

  8. Codeforces Gym 100015C City Driving 离线LCA

    City Driving 题目连接: http://codeforces.com/gym/100015/attachments Description You recently started fre ...

  9. [Codeforces 1239D]Catowise City(2-SAT)

    [Codeforces 1239D]Catowise City(2-SAT) 题面 有n个主人,每个主人都有一只猫.每个主人认识一些猫(包括自己的猫).现在要选出一些人和一些猫,个数均大于0且总共为n ...

随机推荐

  1. angular package.json中start build

    "start": "ng serve --host 0.0.0.0 --port 4200 --proxy-config proxy.conf.json", & ...

  2. 【CodeForces】913 E. Logical Expression

    [题目]E. Logical Expression [题意]令x=11110000(2),y=11001100(2),z=10101010(2),n次询问,每次要求用[与][或][非][括号]构成含至 ...

  3. 读书笔记 ~ Python黑帽子 黑客与渗透测试编程之道

    Python黑帽子  黑客与渗透测试编程之道   <<< 持续更新中>>> 第一章: 设置python 环境 1.python软件包管理工具安装 root@star ...

  4. 配置node,sass,淘宝镜像环境

    由于最近由于刚到手一台新的thinkpad(哈哈,宝宝是个小穷B,木有小苹果),所以工作开发中所用到的环境就需要重新安装一下啦,这里的话,我就把我目前所用到的进行总结一下,其余的会在以后的开发过程中, ...

  5. [整理] magento搬家

    将原来网站文件中的var文件中的cache和session文件删除,将media中的缓存文件删除.然后将所有文件制作成一个压缩包,以减少文件体积,方便转移. 将压缩包转移到新的服务器域名指向的文件夹, ...

  6. 可怕的npm蠕虫

    https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8 ...

  7. php常用表单验证类用法实例

    <?php /** * 页面作用:常用表单验证类 * 作 者:欣然随风 * QQ:276624915 */ class class_post { //验证是否为指定长度的字母/数字组合 func ...

  8. nesC编程入门

    1.接口 NesC程序主要由各式组件(component)构成,组件和组件之间通过特定的接口(interface)互相沟通.一个接口内声明了提供相关服务的方法(C语言函数).例如数据读取接口(Read ...

  9. CRF原理解读

    概率有向图又称为贝叶斯网络,概率无向图又称为马尔科夫网络.具体地,他们的核心差异表现在如何求  ,即怎么表示  这个的联合概率. 概率图模型的优点: 提供了一个简单的方式将概率模型的结构可视化. 通过 ...

  10. ahttp

    # -*- coding: utf-8 -*- # @Time : 2018/8/20 14:35 # @Author : cxa # @File : chttp.py # @Software: Py ...