将相邻且颜色相同的点视作一个连通块,若该连通块是二分图,那么从连通块中一点\(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. 软件架构(六)MVC架构历史

    一.引子 一个系统可能由很多子系统组成.各子系统内部高度内聚,子系统之间低耦合.子系统关注自己的职责.实现:   职责分离,关注点分离.----MVC架构早期就是为了分离视图.模型而诞生的. 注:很多 ...

  2. java中GC的日志认识详解

    不同的垃圾回收器 他们的日志都是完成不一样的,看懂日志是解决和发现问题的重中之重. Parallel Scavenge + Parallel Old 日志 启动参数 -XX:+UseParallelG ...

  3. element-ui v-table 复选框默认选中

    <el-table ref="refTable" :data="list" v-loading="listLoading" eleme ...

  4. vue2 解决跨域

    vue2.x 解决跨域 通过devServer将接口代理到本地在开发的时候,需要请求同局域网内的接口,发现直接使用http://对方的ip地址/接口路径,会出现类似下图的跨域报错 找到并打开vue.c ...

  5. 0基础90分钟会用PS——GenJi笔记

    数码图像的相关基础概念 1.位图和矢量图 位图 也叫点阵图像,位图使用也称像素的一格一格的小点来描述图像,图放大后我们可以看到像素点 矢量图 根据几何特性来绘制图形,用线段和曲线描述图像,可以是一个一 ...

  6. 词云(WordCloud)

    WordCloud的参数: font_path:可用于指定字体路径 width:词云的宽度,默认为 400: height:词云的⾼度,默认为 200: mask:蒙版,可⽤于定制词云的形状: min ...

  7. MongoDB数据库新手入门

    windows安装mongodb 5.0.2 官网下载msi文件 自定义安装到 d:/apptoools/mongodb/ 不要勾选mongodb compass 报错:verify that you ...

  8. 用Nodejs 实现一个简单的 Redis客户端

    目录 0. 写在前面 1. 背景映入 2. 数据库选择 3. Nodejs TCP连接 3. 代码编写 4. 实验 5. wireshark 抓包分析 6. 杂与代码 0. 写在前面 大家如果有去看过 ...

  9. Codeforces Round #832 (Div. 2) A-D

    比赛链接 A 题解 知识点:贪心. 我们考虑把正数和负数分开放,显然把负数和正数放在一起的结果不会更优. 时间复杂度 \(O(n)\) 空间复杂度 \(O(1)\) 代码 #include <b ...

  10. Java安全之Resin2内存马

    Java安全之Resin2内存马 环境 resin2.1.17 添加Filter分析 依然是web.xml注册一个filter,debug进去看注册流程 debug dofilter逻辑时看到如下代码 ...