[HNOI2019]校园旅行

题目

过于神仙啊,抄题解.jpg

首先\(n\)并不是很大啊,我们可以直接用\(f_{i,j}\)表示\(i\)\(j\)是否存在一个回文路径

对于一条回文路径,如果在两端分别添加一个相同的字符,那么仍然是一个回文路径,于是我们可以利用这个来打一个暴力\(bfs\)

就像这样

while(!q[0].empty()) {int x=q[0].front(),y=q[1].front();q[0].pop(),q[1].pop();for(re int i=0;i<v[x].size();i++)for(re int j=0;j<v[y].size();j++) {int xx=v[x][i],yy=v[y][j];if(xx>yy) std::swap(xx,yy);if(S[xx]!=S[yy]||f[xx][yy]) continue;f[xx][yy]=dp[xx][yy]=1;q[0].push(xx),q[1].push(yy);}}

非常显然这个复杂度一点也不科学,卡满就是\(O(m^2)\)的,肯定是要\(T\)

但是\(n\)却不是很大,能不能让边数减小一点呢

之后就不会啦,愉快地抄题解

首先我们注意到一个问题,就是我们只需要关注奇偶性就好了,因为我们可以来回走一条边使得长度增加,但是并不能改变奇偶性

之后我也不知道为什么通过这一点就想到了二分图

我们把边分成两类,一类是连接相同颜色点的边,一类是连接不同颜色点的边

我们考虑一个连通块,这个连通块仅由相同颜色的点构成,显然这个连通块里的边都是第一类边

如果这个连通块是一个二分图,由于二分图不存在奇环,对于任意两个点,所有连接这两个点的路径的奇偶性都是一样的

由于我们也只关注奇偶性,所以只需要对这个二分图搞出来一棵生成树即可

如果这个联通块不是一个二分图,那么就一定存在至少一个奇环,那么我们就可以通过走这个奇环使得路径的奇偶性改变

我们需要让边的数量尽量少,那么只需要求出来一棵有奇环的基环树即可

这些我们都能通过\(dfs\)来完成

对于第二类边,只考虑这些边的话整张图就是一个二分图,于是我们还是对这些边求一个生成树即可

最后我们发现我们这张图的边数已经和\(n\)同级了,于是我们直接上最开始的那个暴力,复杂度就是\(O(n^2)\)

代码

#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
inline int read() {char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=5e3+5;
std::vector<int> v[maxn];
std::queue<int> q[2];
struct E{int v,nxt;}e[1000005];
int n,m,Q,num,tot,flag;
char S[maxn];
int f[maxn][maxn],dp[maxn][maxn],vis[maxn],fa[maxn],sz[maxn],pre[maxn];
int head[maxn],a[500005],b[500005];
inline void add(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;
}
void dfs(int x,int fa) {vis[x]=1;for(re int i=head[x];i;i=e[i].nxt) {if(S[e[i].v]!=S[x]||fa==e[i].v) continue;if(vis[e[i].v]&&S[e[i].v]==S[x]&&!flag) {if(!(pre[e[i].v]^pre[x])) v[x].push_back(e[i].v),v[e[i].v].push_back(x),flag=1;continue;}v[x].push_back(e[i].v);v[e[i].v].push_back(x);pre[e[i].v]=pre[x]^1;dfs(e[i].v,x);}
}
inline int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void merge(int x,int y) {if(sz[x]<sz[y]) fa[y]=x,sz[y]+=sz[x];else fa[x]=y,sz[x]+=sz[y];
}
int main() {n=read(),m=read(),Q=read();scanf("%s",S+1);for(re int x,y,i=1;i<=m;i++) {x=read(),y=read(),add(x,y),add(y,x);if(S[x]!=S[y]) a[++tot]=x,b[tot]=y;}for(re int i=1;i<=n;i++) {if(vis[i]) continue;flag=0;dfs(i,0);}for(re int i=1;i<=n;i++) fa[i]=i,sz[i]=1;for(re int i=1;i<=tot;i++) {int xx=find(a[i]),yy=find(b[i]);if(xx==yy) continue;merge(xx,yy);v[a[i]].push_back(b[i]);v[b[i]].push_back(a[i]);}for(re int i=1;i<=n;i++) f[i][i]=dp[i][i]=1,q[0].push(i),q[1].push(i);for(re int i=1;i<=n;i++) for(re int j=0;j<v[i].size();j++) {int x=i,y=v[i][j];if(x>y) std::swap(x,y);if(S[x]!=S[y]||f[x][y]) continue;f[x][y]=dp[x][y]=1,q[0].push(x),q[1].push(y);}while(!q[0].empty()) {int x=q[0].front(),y=q[1].front();q[0].pop(),q[1].pop();for(re int i=0;i<v[x].size();i++)for(re int j=0;j<v[y].size();j++) {int xx=v[x][i],yy=v[y][j];if(xx>yy) std::swap(xx,yy);if(S[xx]!=S[yy]||f[xx][yy]) continue;f[xx][yy]=dp[xx][yy]=1;q[0].push(xx),q[1].push(yy);}}for(re int x,y,i=1;i<=Q;i++) {x=read(),y=read();if(x>y) std::swap(x,y);puts(dp[x][y]?"YES":"NO");}return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10803482.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Your CPU supports instructions that this TensorFlow binary was not compiled to use AVX AVX2

大致的原因就是说&#xff1a;tensorflow觉得你电脑cpu还行&#xff0c;支持AVX&#xff08;Advanced Vector Extensions&#xff09;&#xff0c;运算速度还可以提升&#xff0c;所以可以开启更好更快的模式&#xff0c;但是你现在用的模式相对来说可能不是那么快&#xff0c;…

安卓 sharedpreferences可以被其它activity读取_Google|再见 SharedPreferences 拥抱 Jetpack DataStore...

Google 新增加了一个新 Jetpack 的成员 DataStore&#xff0c;主要用来替换 SharedPreferences&#xff0c; DataStore 应该是开发者期待已久的库&#xff0c;DataStore 是基于 Flow 实现的&#xff0c;一种新的数据存储方案&#xff0c;它提供了两种实现方式&#xff1a;Proto…

【20171025早】alert(1) to win 练习

本人黑绝楼&#xff0c;自称老黑&#xff0c;男&#xff0c;25岁&#xff0c;曾经在BAT工作过两年&#xff0c;但是一直都是底层人员&#xff0c;整天做重复性工作&#xff0c;甚敢无趣&#xff0c;曾和工作十年之久的同事聊天&#xff0c;发现对方回首过往&#xff0c;生活是寡…

Arduino 与 SPI 结合使用 以及SPI 深层理解

本文主要讲解两部分内容&#xff0c;不做任何转发&#xff0c;仅个人学习记录: 一. Arduino 与 SPI 结合使用 &#xff1a; 二. SPI 深层理解 有价值的几个好的参考&#xff1a; 1. 中文版&#xff1a; https://blog.csdn.net/xxxxxx91116/article/details/42620413 这版本适…

VGG

VGG16网络&#xff0c;卷积核3*3&#xff0c;步长为1&#xff0c;填充&#xff08;padding&#xff09;为1&#xff1b; 池化2*2&#xff0c;步长为2 全连接层 卷积核1*1 Input Layer&#xff1a;224*224*3图像 Conv1-1 Layer&#xff1a;包含64个卷积核&#xff0c;kernal s…

guava 并发同步_Google Guava –与Monitor同步

guava 并发同步Google Guava项目是每个Java开发人员都应该熟悉的库的集合。 Guava库涵盖了I / O&#xff0c;集合&#xff0c;字符串操作和并发性。 在这篇文章中&#xff0c;我将介绍Monitor类。 Monitor是一种同步构造&#xff0c;可以在使用ReentrantLock的任何地方使用。 随…

qt 定时器_Qt开源作品23-颜色拾取器

## 一、前言在做很多项目的UI界面的时候&#xff0c;相信绝大部分人都有过抄袭别人的UI界面尤其是颜色的时候&#xff0c;毕竟十个程序员九个没有审美&#xff0c;或者说审美跟一坨屎一样&#xff0c;大家主要的精力以及擅长点都是在写功能实现具体功能上面&#xff0c;这个事情…

第5章学习小结

第五章主要学习了树的知识&#xff0c;以前一直很好奇&#xff0c;为什么电脑能存储像树一样的数据结构&#xff0c;学完才发现&#xff0c;ADT加数组或者ADT加链表真的可以衍生出多种多样的数据类型&#xff0c;以下做出本章小结&#xff1a; 1.利用ASCII码实现不同类型的数据…

tf.transpose

tf.transpose(input, [dimension_1,dimenaion_2,..,dimension_n]) 这个函数主要适用于交换输入张量的不同维度用的&#xff0c;如果输入张量是二维&#xff0c;就相当是转置。dimension_n是整数&#xff0c;如果张量是三维&#xff0c;就是用0,1,2来表示。这个列表里的每个数对…

【20171025中】alert(1) to win 脚本渲染自建

游戏误人生&#xff0c;一下午玩了将近四个小时的三国杀&#xff0c;后悔不已&#xff0c;然后重新拾起xss challenge&#xff0c;突发奇想&#xff0c;自己构建渲染后的html。 从最简单的开始。 自动检测html: <!DOCTYPE html> <html> <head><meta http-…

使用JPA和@NamedQueries的Spring数据

如果在JPA实体上使用Spring Data和NamedQuery批注&#xff0c;则可以使用spring数据存储库以更方便的方式轻松使用它们。 在先前的博客中&#xff0c;我们使用spring boot和docker 创建了spring数据项目。 我们将使用相同的项目并增强存储库的功能。 我们将实现一个命名查询&…

vs无法写入量的大数据_一个每天服务数万人的企业食堂:自助餐按重计价,大数据支持食材预备量...

钱江晚报小时新闻记者 祝瑶 昨天下午6点多&#xff0c;钱报记者来到杭州阿里巴巴总部。这里共有5个员工食堂&#xff0c;几乎覆盖了全国各地的口味&#xff0c;每天为数万阿里人服务。其中&#xff0c;最当红的是2号食堂&#xff0c;除了有丰俭由人的自助餐区&#xff0c;还有十…

6号板编译失败找不到arm-none-linux-gnueabi-gcc

明明已经添加到/etc/environment 安装sudo apt-get install lib32z1 lib32ncurses5转载于:https://www.cnblogs.com/xpylovely/p/10817240.html

tf.train.Saver

将训练好的模型参数保存起来&#xff0c;以便以后进行验证或测试&#xff0c;这是我们经常要做的事情。tf里面提供模型保存的是tf.train.Saver()模块。 模型保存&#xff0c;先要创建一个Saver对象&#xff1a;如 savertf.train.Saver() 在创建这个Saver对象的时候&#xff…

Neo4j:空值如何工作?

我时不时地发现自己想将CSV文件导入Neo4j&#xff0c;而我总是对如何处理可能潜伏在其中的各种空值感到困惑。 让我们从一个没有CSV文件的示例开始。 考虑以下列表&#xff0c;以及我尝试仅返回空值的尝试&#xff1a; WITH [null, "null", "", "Ma…

楼层钢筋验收会议纪要_钢筋施工质量通病防治

一、钢筋原材1、钢筋表面出现黄色浮锈&#xff0c;严重转为红色&#xff0c;日久后变成暗褐色&#xff0c;甚至发生鱼鳞片剥落现象。图片原因保管不良&#xff0c;受到雨雪侵蚀&#xff0c;存放期长&#xff0c;仓库环境潮湿&#xff0c;通风不良。防 治 措 施1、钢筋原料应存放…

simulink代码生成(一)——环境搭建

一、安装C2000的嵌入式环境&#xff1b; 点击matlab附加功能&#xff0c; 然后搜索C2000&#xff0c;安装嵌入式硬件支持包&#xff1b;点击安装即可&#xff1b;&#xff08;目前还不知道破解版的怎么操作&#xff0c;目前我用的是正版的这样&#xff0c;完全破解的可能操作…

五步法颈椎病自我按摩图解

​​1.揉捏颈、肩、臂 操作&#xff1a;自我按摩时取坐位。拇指张开&#xff0c;其余四指并拢&#xff0c;虎口相对用力&#xff0c;自枕部开始沿颈椎棘突两旁的肌肉向下揉捏&#xff0c;至上背部手能摸到之处为止。反复揉捏3分钟&#xff0c;然后以相同手法揉捏患侧上肢和颈部…

tf.one_hot

tf.one_hot(indices,#输入&#xff0c;这里是一维的depth,# one hotdimension.on_valueNone,#output 默认1off_valueNone,#output 默认0axisNone,#根据我的实验&#xff0c;默认为1dtypeNone,nameNone) 测试程序&#xff0c;一般说&#xff0c;有几类&#xff0c;depth等于分类…

使用get set方法添减属性_头皮银屑病“克星”使用方法,你GET了吗?

相信小伙伴们最近都了解了治疗头皮银屑病需要使用专业剂型。但...方法不对&#xff0c;心血白费。头皮银屑病专用剂型的正确使用方法&#xff0c;你真的知道吗&#xff1f;快来和利奥娜一起&#xff0c;Get√正确的使用方法吧&#xff01;适合头皮银屑病的专用药剂1.复方制剂卡…