题目描述

“我有个愿望,我希望在灿烂千阳时遇见你。”

这是个有n个点的世界,有m条无向边连接着这n个点,但是不保证点之间能够互相到达。

“这个世界的夕阳,只在奇数长的简单路径的尽头。”一个神如是说。

于是我想知道对于一个点对(x,y),x到y之间的所有简单路径中是否存在长度为奇数的路径,只有这样,我才能找到存在有夕阳的路。

输入

第一行两个数n和m表示点的个数和边的条数。

接下来m行,每行两个数x,y表示x和y之间存在一条无向边。

接下来一行一个整数q表示询问的个数。

下面q行每行两个整数x,y表示一组询问,问x到y的所有简单路径中是否存在有长度为奇数的路径

输出

对于每组询问x,y,如果x与y之间存在一条长度为奇数的简单路径那么输出Yes否则输出No

样例输入


样例输出

No
Yes
Yes
Yes
No
Yes
Yes
Yes

数据范围

对于50%的数据,1≤n,m,q≤500

对于100%的数据,,1≤n,q,m≤100000

保证没有自环与重边。

题解:

若对原图解出生成树森林,那么询问点对(x,y)见是否有简单路径长度为奇数,可以看作求点对(x,y)是否有边在奇环上。

于是问题转化为判断是否有边在奇环中,这里解图的强联通分量,对于一个强联通分量,若其中有边在奇环上,那么分量中的所有边都在某个奇环上。

为了在分量中找到在奇环上的边,对图作tarjan算法,若点对(x,y)的深度的奇偶性相同,那么x和y的路径上的边都在奇环中。

#include<math.h>
#include<stdio.h>
#include<string.h>
#define buf 100001
#define MAXBUF 1<<9
#define dmin(a,b) ((a)<(b)?(a):(b))
inline void swp(int &x,int &y){
x^=y,
y^=x,
x^=y;
}
char B[MAXBUF],*S=B,*T=B;
inline char gt(){
if(S==T){
T=(S=B)+fread(B,,MAXBUF,stdin);
if(S==T)
return ;
}
return *S++;
}
inline void F(int &x){
x=;int c=gt(),f=;
for(;c<||c>;c=gt())
if(!(c^))
f=-;
for(;c>&&c<;c=gt())
x=(x<<)+(x<<)+c-;
x*=f;
}
struct Pointer{
int to;
Pointer *nxt;
}*fst[buf];
Pointer mem[buf<<],*tot=mem;
inline void link(int a,int b){
*++tot=(Pointer){b,fst[a]},fst[a]=tot;
*++tot=(Pointer){a,fst[b]},fst[b]=tot;
}
bool odd[buf];
int bin[],n,m,dfn[buf],dep[buf],fa[buf][],tim,s[buf],top,pb[buf],timer,low[buf],scn[buf],scx;
void tarjan(int x){
pb[++top]=x;
dfn[x]=low[x]=++timer;
for(int i=;i<=tim;i++)
fa[x][i]=fa[fa[x][i-]][i-];
for(Pointer *iter=fst[x];iter;iter=iter->nxt)
if(iter->to^fa[x][])
if(!dfn[iter->to])
fa[iter->to][]=x,
dep[iter->to]=dep[x]+,
tarjan(iter->to),
low[x]=dmin(low[x],low[iter->to]);
else
if(!scn[iter->to]){
low[x]=dmin(low[x],dfn[iter->to]);
if(!((dep[iter->to]&)^(dep[x]&)))
odd[x]=;
}
if(!(dfn[x]^low[x])){
bool f=;
int v=top;
for(;pb[v]^x;)
f|=odd[pb[v--]];
if(f)
for(v++;v<=top;v++)
s[pb[v]]++;
++scx;
do
v=pb[top--],
scn[v]=scx;
while(v^x);
}
}
void dfs(int x){
for(Pointer *iter=fst[x];iter;iter=iter->nxt)
if(!(fa[iter->to][]^x))
s[iter->to]+=s[x],
dfs(iter->to);
}
int lca(int x,int y){
if(dep[x]<dep[y])
swp(x,y);
for(int i=tim;i>=;i--)
if(dep[fa[x][i]]>=dep[y])
x=fa[x][i];
if(!(x^y))
return x;
for(int i=tim;i>=;i--)
if(fa[x][i]^fa[y][i])
x=fa[x][i],
y=fa[y][i];
return fa[x][];
}
int main(){
freopen("sunset.in","r",stdin),
freopen("sunset.out","w",stdout);
F(n),F(m);
tim=log(n)/log()+;
bin[]=;
for(int i=;i<=tim;i++)
bin[i]=bin[i-]<<;
for(int x,y;m;m--)
F(x),
F(y),
link(x,y);
for(int i=;i<=n;i++)
if(!dfn[i])
dep[i]=,
fa[i][]=i,
tarjan(i);
for(int i=;i<=n;i++)
if(!(fa[i][]^i))
dfs(i);
int q,x,y,t;
for(F(q);q;q--){
F(x),F(y);
if(fa[x][tim]^fa[y][tim])
puts("No");
else
t=lca(x,y),
puts(((dep[x]+dep[y]-(dep[t]<<))&
||s[x]+s[y]-(s[t]<<)>)?
"Yes":
"No");
}
fclose(stdin),
fclose(stdout);
}

NOIP模拟赛 夕阳的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. Tint(着色器)的兼容实现

    我们在做控件的时候可以使用tint这个属性给控件上色,这样在很多情况下能减少不同色彩的资源色彩.在MD设计中,控件颜色随着主体改变也是一大要点,今天我们就来看看如何使用它. 使用步骤:1.建立一个控件 ...

  2. 颜色线性渐变-CAGradientLayer

    我们先来看一下效果图吧: 其实,就是一个颜色的线性渐变,使用CAGradientLayer很容易就能实现.由于代码很简单,就不做过多讲解了,直接看代码吧. import UIKit class Vie ...

  3. iOS 学习 - 10下载(3) NSURLSession 音乐 篇

    使用 NSURLSession 下载,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中 // // ViewController.m // Web ...

  4. 网络编程--ASI--(ASIHTTPRequest)介绍

    ASIHTTPRequest 虽然是明日黄花,但是还是稍微归纳一下,理清思路,知道这个曾经的她都能干嘛. 1. ASI基于底层的 CFNetworking 框架,运行效率很高. 2. 黄金搭档:ASI ...

  5. IOS开发之多线程 -- GCD的方方面面

    前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ...

  6. DOTA2参数收集

    -language schinese 显示中文界面(使用英文语音的同学使用) -perfectworld 登陆国服(Steam平台) -novid 不显示启动动画

  7. 我参加了51CTO博客大赛,求投票!

    我是张传波,也是Fireball(火球). 我参加了51CTO博客大赛,距离网络投票截止没有几天了,求投票!我的参赛链接:http://blog.51cto.com/contest2013/82313 ...

  8. 基于微软平台IIS/ASP.NET开发的大型网站有哪些?

    首先说明一下,本文绝不是要说Microsoft平台多么好,多么牛.只是要提醒一些LAMP/Java平台下的同志们,微软平台不至于像你们说的,和想象的那么不堪!只是你们自己不知道而已.同时,也希望广大M ...

  9. MySQL分表自增ID解决方案

    当我们对MySQL进行分表操作后,将不能依赖MySQL的自动增量来产生唯一ID了,因为数据已经分散到多个表中. 应尽量避免使用自增IP来做为主键,为数据库分表操作带来极大的不便. 在postgreSQ ...

  10. Java基础知识学习(二)

    Java语法基础 数据类型.类型转换.运算符.逻辑运算符.参考C#,基本一致 输入输出 输出 System.out.print("abc"); System.out.printf( ...