【BZOJ5492】校园旅行(图论 搜索优化)
大意
给出\(N\)个点,\(M\)条边的一张图,其中每个点都有一个0或1的颜色。
再给出\(Q\)个询问,每次询问查询两个点之间是否存在一条路径,使得路径上的颜色组成的01字符串是一个回文串。(这条路径上的每条边可以重复经过)
思路
首先有一个暴力的想法,我们设\(Ans[u1][u2]=1\)表示\(u1\)~\(u2\)之间存在一条回文串路径。
我们可以将满足\(Ans[u1][u2]=1\)的\(pair(u1,u2)\)放入一个队列中,暴力往外拓展。
每次枚举与\(u1,u2\)相邻的两个点\(v1,v2\),若\(col[v1]=col[v2]\),说明\(v1\)~\(v2\)间也有一条回文路径。
故将\(Ans[v1][v2]\)的值更为1,然后将\(pair(v1,v2)\)放入队列,不断循环,直到不能更新。

但这样的时间复杂度可以达到\(O(M^2)\):
假如每个点颜色都一样,那么我们就会枚举到每一个点对,即我们也会枚举到所有的边对。
考虑优化以上算法:
我们将边分为两类,端点颜色相同的边称为第一类,不同称为第二类:
考虑第一类边对答案的影响:
我们将该图仅按第一类边连接起来,那么每个连通块内的颜色都是一样的。
又由于一条边可以经过多次,那么我们只需考虑一个连通块对回文串某段长度奇偶性的影响即可。
- 倘若一个连通块为一个二分图(即不存在奇环),那么这个连通块内任意两点之间的路径长度奇偶性是不变的。
所以我们考虑将该二分图变成一颗树,那么依然满足任意两点间的路径长度奇偶性不变。 - 倘若不是二分图,那么该连通块一定存在某个奇环,那么这个连通块内任意两点之间的路径长度就是可奇可偶的。
对于这种图,我们也可以将它变成一颗树,然后随便在某个点上加个自环就可以了。
因为这样我们还是可以通过走自环点使得路径长度可奇可偶。
考虑第二类边对答案的影响:
首先很显然的是,仅用第二类边连成的图一定是一个二分图,那么就又可以套用刚才奇偶性的结论,生成一棵树即可。
这样修改了以后,对答案的正确性是没有影响的,但是边的数量级变为了\(O(N)\),这样我们就可以直接套用之前的暴力做法,\(O(N^2)\)出解了。
注:文中的“树”在不连通的情况下是指森林。
代码
//#pragma GCC optimize(2)
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=5005;
const int MAXM=500005;
char c[MAXN];
int Fa[MAXN],Cnt;
int N,M,K,col[MAXN];
int Ans[MAXN][MAXN];
int Col[MAXN],vis[MAXN];
queue<pair<int,int> >Q;
vector<int>P[MAXN],E[MAXN];
struct Edge{int x,y;}s[MAXM];
int Find(int x){return Fa[x]==x?x:Fa[x]=Find(Fa[x]);}
inline void read(int &x){
x=0;char c=getchar();bool f=0;
if(c=='-')f=1;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
if(f==1)x=-x;
}
void Init_BFS(){
while(!Q.empty()){
pair<int,int>u=Q.front();Q.pop();
int u1=u.first,u2=u.second;
int size1=P[u1].size();
int size2=P[u2].size();
for(int i=0;i<size1;i++){
int v1=P[u1][i];
for(int j=0;j<size2;j++){
int v2=P[u2][j];
if(Ans[v1][v2])continue;
if(col[v1]!=col[v2])continue;
Ans[v1][v2]=Ans[v2][v1]=1;
Q.push(make_pair(v1,v2));
}
}
}
}
int Ok;
int DFS(int u){
int Ok=0;vis[u]=1;
int size=E[u].size();
for(int i=0;i<size;i++){
int v=E[u][i];
if(vis[v]){
if(Col[u]==Col[v])Ok=1;
continue;
}
P[u].push_back(v);
P[v].push_back(u);
Q.push(make_pair(u,v));
Ans[u][v]=Ans[v][u]=1;
Col[v]=(Col[u]+1)%2;
if(DFS(v))Ok=1;
}
return Ok;
}
int main(){
scanf("%d%d%d%s",&N,&M,&K,c+1);
for(int i=1;i<=N;i++)col[i]=c[i]-'0';
for(int i=1,x,y;i<=M;i++){
read(x);read(y);
if(col[x]==col[y]){
E[x].push_back(y);
E[y].push_back(x);
}
else Cnt++,s[Cnt].x=x,s[Cnt].y=y;
}
for(int i=1;i<=N;i++){
if(vis[i])continue;
if(DFS(i))P[i].push_back(i);
}
for(int i=1;i<=N;i++)
Ans[i][i]=1,Q.push(make_pair(i,i));
for(int i=1;i<=N;i++)Fa[i]=i;
for(int i=1;i<=Cnt;i++){
int fx=Find(s[i].x);
int fy=Find(s[i].y);
if(fx==fy)continue;
Fa[fx]=fy;
P[s[i].x].push_back(s[i].y);
P[s[i].y].push_back(s[i].x);
}
Init_BFS();
for(int i=1,x,y;i<=K;i++){
scanf("%d%d",&x,&y);
if(col[x]!=col[y]){
printf("NO\n");
continue;
}
if(Ans[x][y]==1)puts("YES");
else puts("NO");
}
}
【BZOJ5492】校园旅行(图论 搜索优化)的更多相关文章
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 一次 ElasticSearch 搜索优化
一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...
- Loj #3057. 「HNOI2019」校园旅行
Loj #3057. 「HNOI2019」校园旅行 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你 ...
- 【随笔】Android应用市场搜索优化(ASO)
参考了几篇网上的关于Android应用市场搜索优化(ASO)的分析,总结几点如下: 优化关键字:举例目前美团酒店在各Android市场上的关键字有“美团酒店.钟点房.团购.7天”等等,而酒店类竞对在“ ...
- [HNOI2019]校园旅行(构造+生成树+动规)
题目 [HNOI2019]校园旅行 做法 最朴素的做法就是点对扩展\(O(m^2)\) 发现\(n\)比较小,我们是否能从\(n\)下手减少边数呢?是肯定的 单独看一个颜色的联通块,如果是二分图,我们 ...
- 针对TianvCms的搜索优化文章源码(无版权, 随便用)
介绍: 搜索优化虽然不是什么高深的技术, 真正实施起来却很繁琐, 后台集成搜索优化的文章可以便于便于管理, 也让新手更明白优化的步奏以及优化的日常. 特点: 根据自己的经验和查阅各种资料整理而成, 相 ...
- seo搜索优化教程09 - seo搜索优化外链优化
为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第九课 网络营销推广中有句行话,叫做"内容为王,外链为王",可见外链对于 ...
- seo搜索优化教程10-黑帽SEO
为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第十课 学习黑帽SEO并不是教大家如何作弊,而是想让大家避免使用黑帽SEO手法,从而导致被搜 ...
- seo搜索优化教程11-seo搜索优化关键词策略
为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第11课 关键词在seo搜索优化中有着重要的地位,本节主要讲解seo搜索优化中关键词优化的相 ...
随机推荐
- C/C++ Qt 运用JSON解析库 [基础篇]
JSON是一种简单的轻量级数据交换格式,Qt库为JSON的相关操作提供了完整的类支持,使用JSON解析文件之前需要先通过TextStream流将文件读入到字符串变量内,然后再通过QJsonDocume ...
- 解构插槽 Prop
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <link rel ...
- 初识python: 多态
多态:允许你将父对象设置成为,与一个或更多其子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作. 简单讲就是:允许将子类类型的指针赋值给父类类型的指针. 多态 ...
- mysql数据库主从复制教程
mysql主从复制教程 架构规划: 192.168.201.150 master 主节点 192.168.201.154 slave 从节点 1. 修改mysql的配置文件(主节点,从节点都要修改) ...
- CentOS6.4安装Zookeeper-3.4.12图解教程
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6595380916590215683/ 安装工具 VMware_workstation_full_12.5.2 Ce ...
- Hive UDF,就这
摘要:Hive UDF是什么?有什么用?怎么用?什么原理?本文从UDF使用入手,简要介绍相关源码,UDF从零开始. 本文分享自华为云社区<Hive UDF,就这>,作者:汤忒撒. Hive ...
- MASA Framework - 整体设计思路
源起 年初我们在找一款框架,希望它有如下几个特点: 学习成本低 只需要学.Net每年主推的技术栈和业务特性必须支持的中间件,给开发同学减负,只需要专注业务就好 个人见解:一款好用的框架应该是补充,而不 ...
- HTTP2和WebSocket
HTTP http是目前应用最广泛的应用层协议,截止到目前为止已经发布了多个版本,最常用的是http1.1和http2. http0.9是最早的版本,功能很简单,没有header,只支持GET. ht ...
- WPF使用MVVM(二)-命令绑定
WPF使用MVVM(二)-命令绑定 上一节已经介绍了WPF的属性绑定,这使得我们只需要指定界面的DataContext,然后就可以让界面绑定我们的属性数据呢. 但是上一节还遗留了一个问题就是我们的按钮 ...
- 【刷题-LeetCode】123 Best Time to Buy and Sell Stock III
Best Time to Buy and Sell Stock III Say you have an array for which the ith element is the price of ...