Codeforces 521 E cycling city
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的更多相关文章
- 「CF521E」 Cycling City
「CF521E」 Cycling City 传送门 首先你能发现这个东西一定是两个环的公共边. 最开始想的是什么如果一个点被访问过三次那它一定是公共边的某一端之类的东西,然后发现被仙人掌叉掉. 然后就 ...
- Cycling City CF521E
Cycling City 毒瘤题 首先建dfs树,由于是个无向图所有返祖边都是连向祖先的. 判是否有解其实很简单,只要图不是一个仙人掌就有解了. 仙人掌有关可以看这个博客 但是这道题由于要输出路径成功 ...
- Codeforces 521E - Cycling City(点双连通分量+分类讨论)
Codeforces 题面传送门 & 洛谷题面传送门 大家都是暴力找生成树然后跳路径,代码不到 50 行(暴论)的一说--好,那本蒟蒻决定提供一种代码 150 行,但复杂度也是线性的分类讨论做 ...
- CodeForces 821D Okabe and City
Okabe and City 题解: 将行和列也视为一个点. 然后从普通的点走到行/列的点的话,就代表这行/列已经被点亮了. 然后将费用为0的点建上边. 注意讨论(n,m)非亮的情况下. 代码: #i ...
- codeforces B. Strongly Connected City(dfs水过)
题意:有横向和纵向的街道,每个街道只有一个方向,垂直的街道相交会产生一个节点,这样每个节点都有两个方向, 问是否每一个节点都可以由其他的节点到达.... 思路:规律没有想到,直接爆搜!每一个节点dfs ...
- [CF]Cycling City
题目大意:给定一张无向图,问图中是否存在两个点,使得这两个点之间有三条路径,而且三条路径没有公共点. 解法: 我们可以先走出来一个环,再出环上任意一点走到另外一点.就像这样:
- 专题:CF图论杂题
题目是来自HZW的博客(构造题我是各种不会...) Solved 1 / 1 A CodeForces 500A New Year Transportation Solved 1 / 1 B Code ...
- Codeforces Gym 100015C City Driving 离线LCA
City Driving 题目连接: http://codeforces.com/gym/100015/attachments Description You recently started fre ...
- [Codeforces 1239D]Catowise City(2-SAT)
[Codeforces 1239D]Catowise City(2-SAT) 题面 有n个主人,每个主人都有一只猫.每个主人认识一些猫(包括自己的猫).现在要选出一些人和一些猫,个数均大于0且总共为n ...
随机推荐
- 【NOI2017】游戏 2-sat算法
[题目]LibreOJ [题意]n场游戏,有三种车ABC,给定长度为n的字符串,'a'表示不能选A,'b''c'同理,'x'表示不限,至多d个'x'.有m个限制(i,hi,j,hj)表示如果第i场选择 ...
- 指针A - 签到题(顺序三元组)
给定一个长度为N的数组A=[A1, A2, ... AN],已知其中每个元素Ai的值都只可能是1, 2或者3. 请求出有多少下标三元组(i, j, k)满足1 ≤ i < j < k ≤ ...
- 【leetcode 简单】第三十六题 最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...
- 47、Python面向对象中的继承有什么特点?
继承的优点: 1.建造系统中的类,避免重复操作. 2.新类经常是基于已经存在的类,这样就可以提升代码的复用程度. 继承的特点: 1.在继承中基类的构造(__init__()方法)不会被自动调用,它需要 ...
- LOW逼三人组(二)----选择排序算法
选择排序思路: 算法程序: def cal_time(func): # 装饰器 ,用来检测算法所执行的时间 def wrapper(*args,**kwargs): t1=time.time() re ...
- npm install ERR! code E400/E404
在安装webpack的过程中,出现了一个报错npm install ERR! code E400/E404 解决方法: 1.查看npm配置文件 是否有错误: 执行 npm config edit 查看 ...
- Class类和ClassLoader类的简单介绍
反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; 1.Class类: 1. 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构 ...
- Ubuntu vi 上下左右变ABCD问题解决方法
---恢复内容开始--- 错误问题:vi上下左右键显示为ABCD的问题 解决方法: 只要依次执行以下两个命令即可完美解决Ubuntu下vi编辑器方向键变字母的问题. 一.执行命令 sudo apt-g ...
- CSS&&xpath
1.元素选择器 <div class="wrap"> 直接选择文档元素div 2.类选择器 <div class="wrap"> 元素的 ...
- python中调用cmd
1. 使用os.system("cmd") 这是最简单的一种方法,特点是执行的时候程序会打出cmd在linux上执行的信息.使用前需要import os. os.system(&q ...