将相邻且颜色相同的点视作一个连通块,若该连通块是二分图,那么从连通块中一点\(x\)到连通块中一点\(y\)的路径的奇偶性确定

所以对于块外一点\(x\)到块内一点\(y\),可以将它们的路径在连通块内的部分看作在一条边上反复横跳(这样奇偶性不变且当路径长度不够时可以凑长度),然后决定是否走出这条边而走向下一条边

所以在二分图中,环没有必要存在,只需要它的最小生成树即可(二分图的环的作用就是凑长度,而反复横跳一条边也可以达成这一目的,且二者都不会改变奇偶性)

若不是连通块,也就是存在奇环,那么奇偶性就会发生变化(奇环走一圈),所以奇环不能用反复横跳来替代

所以在非二分图的连通块中,我们只需要保留一个奇环即可,而为了方便,我们可以随机给一个节点连一条自环

#include<bits/stdc++.h>
#define pr pair<int,int>
#define fi first
#define se second
using namespace std;
const int N=5e3+5,M=5e5+5,MN=1e6+5e3+5;
int n,m,Q;
char s[N];
int head[N],cnt;
struct node{
int v,nxt;
}tree[MN];
void add(int x,int y){
tree[++cnt].v=y,tree[cnt].nxt=head[x],head[x]=cnt;
}
vector<int> edge[N];
bool flag[N][N];
queue<pr> q; void add1(int x,int y){
flag[x][y]=flag[y][x]=1,q.push(pr(x,y));
}
int color[N];
bool f;
void dfs(int x,int now){
color[x]=now;
for(int i=0,y;i<edge[x].size();++i){
y=edge[x][i];
if(s[x]==s[y]){
if(color[x]==color[y]) f=true;
if(color[y]!=-1) continue;
add1(x,y),add(x,y),add(y,x);
dfs(y,now^1);
}
}
}
bool vis[N];
void dfs1(int x){
vis[x]=true;
for(int i=0,y;i<edge[x].size();++i){
y=edge[x][i];
if(s[x]!=s[y]&&!vis[y]) add(x,y),add(y,x),dfs1(y);
}
}
void solve(){
int x,y;
while(q.size()){
x=q.front().fi,y=q.front().se,q.pop();
for(int i=head[x],x1;i;i=tree[i].nxt)
for(int j=head[y],y1;j;j=tree[j].nxt){
x1=tree[i].v,y1=tree[j].v;
if(s[x1]==s[y1]&&!flag[x1][y1]) add1(x1,y1);
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&Q);
getchar(); cin>>s+1;
for(int i=1,u,v;i<=m;++i) scanf("%d%d",&u,&v),edge[u].push_back(v),edge[v].push_back(u);
for(int i=1;i<=n;++i) add1(i,i),color[i]=-1;
for(int i=1;i<=n;++i){
f=false;
if(color[i]!=-1) continue;
dfs(i,1);
if(f) add(i,i);
}
for(int i=1;i<=n;++i) if(!vis[i]) dfs1(i);
solve();
while(Q--){
int u,v; scanf("%d%d",&u,&v);
printf(flag[u][v]?"YES\n":"NO\n");
}
return 0;
}

「HNOI2019」校园旅行的更多相关文章

  1. Loj #3057. 「HNOI2019」校园旅行

    Loj #3057. 「HNOI2019」校园旅行 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你 ...

  2. LOJ 3057 「HNOI2019」校园旅行——BFS+图等价转化

    题目:https://loj.ac/problem/3057 想令 b[ i ][ j ] 表示两点是否可行,从可行的点对扩展.但不知道顺序,所以写了卡时间做数次 m2 迭代的算法,就是每次遍历所有不 ...

  3. 「loj3057」「hnoi2019」校园旅行

    题目 一个n个点m条边的无向图,每个点有0 / 1 的标号; 有q个询问,每次询问(u,v)直接是否存在回文路径(可以经过重复的点和边); $1 \le n \le 5 \times 10^3  , ...

  4. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  5. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  6. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  7. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

  8. [LOJ3054] 「HNOI2019」鱼

    [LOJ3054] 「HNOI2019」鱼 链接 链接 题解 首先想 \(O(n^3)\) 的暴力,不难发现枚举 \(A\) 和 \(D\) 后, \((B,C)\) 和 \((E,F)\) 两组点互 ...

  9. 【loj - 3056】 「HNOI2019」多边形

    目录 description solution accepted code details description 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时 ...

  10. 【loj - 3055】「HNOI2019」JOJO

    目录 description solution accepted code details description JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或 ...

随机推荐

  1. Unity之"诡异"的协程

    为什么说是诡异的协程呢?首先从一个案例说起吧,示例如下: 游戏目标:让小车进入到对应颜色屋子里,即可获得一分.(转弯的道路可控)   为了让小车能够平滑转弯,小车的前进方向需要和车子的位置与圆心组成的 ...

  2. 【Android逆向】rpc调用某安App的X-App-Token签名函数

    阅读此文档的过程中遇到任何问题,请关注公众号[移动端Android和iOS开发技术分享]或加QQ群[309580013] 1.目标 在学习的过程中,会遇到有些算法比较麻烦,没有办法直接还原.那我们就另 ...

  3. 【云原生 · Kubernetes】部署Kubernetes集群

    [云原生 · Kubernetes]搭建Harbor仓库 接着上次的内容,后续来了! 在master节点执行脚本k8s_master_install.sh即可完成K8S集群的部署,具体步骤参考如下(1 ...

  4. 基于python的数学建模---scipy库

    instance1: 求解下列线性规划问题 s.t.   代码: from scipy import optimizeimport numpy as npc = np.array([2,3,-5])A ...

  5. Android网络请求(1)

    Android网络请求(1) ​ 安卓开发网络请求可谓是安卓开发的灵魂,如果你不会网络请求,那么你开发的应用软件就是一具没有灵魂的枯骨. ​ 在安卓开发中进行网络请求和java中的网络请求有异曲同工之 ...

  6. EntityUtils MapStruct BeanCopier 数据实体类转换工具 DO BO VO DTO 附视频

    一.序言 在实际项目开发过程中,总有数据实体类互相转换的需求,DO.BO.VO.DTO等数据模型转换经常发生.今天推荐几个好用的实体类转换工具,分别是EntityUtils MapStruct Bea ...

  7. Codeforces Round #836 (Div. 2) A-D

    比赛链接 A 题意 给一个字符串 \(s\) ,对其加倍,即每个字符后面追加一个相同字符. 加倍后可以重排列,要求构造一个回文串. 题解 知识点:构造. 既然可以重排列了,那顺序是随意的了,直接翻转加 ...

  8. 【Shell案例】【awk每行执行一次】11、转置文件的内容

    描述写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容. 为了简单起见,你可以假设:你可以假设每行列数相同,并且每个字段由空格分隔 示例:假设 nowcoder.txt 内容如下: ...

  9. JavaEE Day05 JDBC(用Java语言操作数据库)

    今日内容 基本概念 快速入门 对JDBC中各个接口和类的详解 一.基本概念 1.概念:Java Database Connectivity:Java数据库连接,Java语言操作数据库 2.本质:官方( ...

  10. Docker容器入门到精通

    Docker 容器 快速入门 第一章:Docker容器 第二章:Dockerfile指令与Docker-compose容器编排-搭建docker私有仓库 h1 { color: rgba(0, 60, ...