题目链接

大意

给出\(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】校园旅行(图论 搜索优化)的更多相关文章

  1. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  2. 一次 ElasticSearch 搜索优化

    一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...

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

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

  4. 【随笔】Android应用市场搜索优化(ASO)

    参考了几篇网上的关于Android应用市场搜索优化(ASO)的分析,总结几点如下: 优化关键字:举例目前美团酒店在各Android市场上的关键字有“美团酒店.钟点房.团购.7天”等等,而酒店类竞对在“ ...

  5. [HNOI2019]校园旅行(构造+生成树+动规)

    题目 [HNOI2019]校园旅行 做法 最朴素的做法就是点对扩展\(O(m^2)\) 发现\(n\)比较小,我们是否能从\(n\)下手减少边数呢?是肯定的 单独看一个颜色的联通块,如果是二分图,我们 ...

  6. 针对TianvCms的搜索优化文章源码(无版权, 随便用)

    介绍: 搜索优化虽然不是什么高深的技术, 真正实施起来却很繁琐, 后台集成搜索优化的文章可以便于便于管理, 也让新手更明白优化的步奏以及优化的日常. 特点: 根据自己的经验和查阅各种资料整理而成, 相 ...

  7. seo搜索优化教程09 - seo搜索优化外链优化

    为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第九课 网络营销推广中有句行话,叫做"内容为王,外链为王",可见外链对于 ...

  8. seo搜索优化教程10-黑帽SEO

    为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第十课 学习黑帽SEO并不是教大家如何作弊,而是想让大家避免使用黑帽SEO手法,从而导致被搜 ...

  9. seo搜索优化教程11-seo搜索优化关键词策略

    为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉科技强势推出seo搜索优化教程.此为seo教程第11课 关键词在seo搜索优化中有着重要的地位,本节主要讲解seo搜索优化中关键词优化的相 ...

随机推荐

  1. Nginx-正反向代理及负载均衡

    目录 正/反向代理 代理的方式 Nginx代理服务支持的协议 代理实战 部署web01 部署Lb01 Nginx代理常用参数 添加发往后端服务器的请求头信息 代理到后端的TCP连接.响应.返回等超时时 ...

  2. .NET 微服务——CI/CD(4):避坑和一点经验

    如果你看过之前几篇文章,应该已经Jenkins成功搭建了CICD环境,但是进入正式环境会有一些坑,不注意中招的话很难受,这里总结一下,避免重复消耗精力. 后门漏洞 Jenkins有后门,这是个老问题了 ...

  3. 您应该知道的35个绝对重要的Linux命令

    https://mp.weixin.qq.com/s?__biz=MzU3NTgyODQ1Nw==&mid=2247499293&idx=2&sn=1353b78d6ad01d ...

  4. Ant <Delete> 如何只删掉文件夹下所有文件和文件夹

    用 fileset 来过滤要删掉的目录和文件 <project name="ant-project" default="example"> < ...

  5. 细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】

    1.前言 匿名内部类是什么东西? 没有名字的内部类就是匿名内部类. 什么场景使用? 匿名内部类适合创建那种只需要一次使用的类. 这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的 ...

  6. MASA Framework - 整体设计思路

    源起 年初我们在找一款框架,希望它有如下几个特点: 学习成本低 只需要学.Net每年主推的技术栈和业务特性必须支持的中间件,给开发同学减负,只需要专注业务就好 个人见解:一款好用的框架应该是补充,而不 ...

  7. 谷歌性能测评工具lighthouse使用

    1.谷歌插件lighthouse的基本介绍 Lighthouse 是一个网站性能测评工具, 它是 Google Chrome 推出的一个开源自动化工具,能够对 PWA 和网页多方面的效果指标进行评测, ...

  8. 【C primer plus】初始化链表函数的错误

    C primer plus第六版 的一处错误 第五百页17.3.4 实现接口的程序清单17.5中的初始化链表函数有误 #源代码 void InitializeList(List * plist) { ...

  9. 【小记录】解决链接libcufft_static.a库出现的错误

    程序中使用了 cv::cuda::dft() 函数,需要在链接的时候使用libcufft_static.a这个库.链接出现大量类似错误:error: undefined reference to __ ...

  10. 使用EdgyGeo Cesium工具查询下载数据集

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ EdgyGeo, Inc. 带来了一件非常棒的工作支撑架构.工程 ...