[HNOI2019]校园旅行(构造+生成树+动规)
题目
做法
最朴素的做法就是点对扩展\(O(m^2)\)
发现\(n\)比较小,我们是否能从\(n\)下手减少边数呢?是肯定的
单独看一个颜色的联通块,如果是二分图,我们生产树和原来的效果相同
如果不是二分图,是会有一个环的,在树上随便圈一个自环和原来的效果相同
而看不同颜色的连边,一定是二分图,再生产树就好了
总边数是\(n\)级的,总复杂度\(O(n^2)\)
Code
#include<bits/stdc++.h>
#include<queue>
typedef int LL;
const LL maxn=5009,maxm=500009;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}
return x*f;
}
LL f;
LL visit[maxn],col[maxn],a[maxn],fa[maxn];
LL n,m,q,top;
LL mark[maxn][maxn];
struct edge{
LL u,v;
}e[maxm];
LL Get_fa(LL x){
return fa[x]==x?x:fa[x]=Get_fa(fa[x]);
}
struct Mp{
struct node{
LL to,nxt;
}dis[maxm<<1];
LL num;
LL head[maxn];
inline void Add(LL u,LL v){
dis[++num]=(node){v,head[u]}; head[u]=num;
}
void Dfs1(LL u,LL c){
visit[u]=true; col[u]=c;
for(LL i=head[u];i;i=dis[i].nxt){
LL v(dis[i].to);
if(a[v]!=a[u]) continue;
if(visit[v]){
if(col[v]==col[u]) f=true;
continue;
}
LL fx(Get_fa(u)),fy(Get_fa(v));
if(fx!=fy){
fa[fx]=fy;
e[++top]=(edge){u,v};
}
Dfs1(v,3-c);
}
}
void Dfs2(LL u){
visit[u]=true;
for(LL i=head[u];i;i=dis[i].nxt){
LL v(dis[i].to);
if(a[v]==a[u] || visit[v]) continue;
LL fx(Get_fa(u)),fy(Get_fa(v));
if(fx!=fy){
e[++top]=(edge){u,v};
fa[fx]=fy;
}
Dfs2(v);
}
}
}G1,G2;
std::queue<edge> que;
inline void Build(){
for(LL i=1;i<=n;++i) fa[i]=i;
for(LL i=1;i<=n;++i){
if(!visit[i]){
f=false;
G1.Dfs1(i,1);
if(f) G2.Add(i,i);
}
}
memset(visit,false,sizeof(visit));
for(LL i=1;i<=n;++i) fa[i]=i;
for(LL i=1;i<=n;++i)
if(!visit[i])
G1.Dfs2(i);
for(LL i=1;i<=top;++i){
LL u(e[i].u),v(e[i].v);
G2.Add(u,v); G2.Add(v,u);
}
for(LL u=1;u<=n;++u){
que.push((edge){u,u}); mark[u][u]=true;
for(LL i=G2.head[u];i;i=G2.dis[i].nxt){
LL v(G2.dis[i].to);
if(a[v]==a[u]){
que.push((edge){v,u});
mark[v][u]=mark[u][v]=true;
}
}
}
while(que.size()){
edge tmp(que.front()); que.pop();
LL u(tmp.u),v(tmp.v);
for(LL i=G2.head[u];i;i=G2.dis[i].nxt){
LL v1(G2.dis[i].to);
for(LL j=G2.head[v];j;j=G2.dis[j].nxt){
LL v2(G2.dis[j].to);
if(a[v1]==a[v2]){
if(!mark[v1][v2]){
mark[v1][v2]=mark[v2][v1]=true;
que.push((edge){v1,v2});
}
}
}
}
}
}
char s[maxn];
int main(){
n=Read(),m=Read(),q=Read();
scanf(" %s",s+1);
for(LL i=1;i<=n;++i) a[i]=s[i]-'0';
while(m--){
LL u(Read()),v(Read());
G1.Add(u,v); G1.Add(v,u);
}
Build();
while(q--){
LL u(Read()),v(Read());
if(mark[u][v]) puts("YES");
else puts("NO");
}
return 0;
}
[HNOI2019]校园旅行(构造+生成树+动规)的更多相关文章
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- Luogu P5292 [HNOI2019]校园旅行
非常妙的一道思博题啊,不愧是myy出的题 首先我们考虑一个暴力DP,直接开一个数组\(f_{i,j}\)表示\(i\to j\)的路径能否构成回文串 考虑直接拿一个队列来转移,队列里存的都是\(f_{ ...
- [HNOI2019]校园旅行
题意 https://www.luogu.org/problemnew/show/P5292 思考 最朴素的想法,从可行的二元组(u,v)向外拓展,及u的出边所指的颜色与v的出边所指的颜色若相同,继续 ...
- 洛谷P5292 [HNOI2019]校园旅行(二分图+最短路)
题面 传送门 题解 如果暴力的话,我们可以把所有的二元组全都扔进一个队列里,然后每次往两边更新同色点,这样的话复杂度是\(O(m^2)\) 怎么优化呢? 对于一个同色联通块,如果它是一个二分图,我们只 ...
- [LOJ3057] [HNOI2019] 校园旅行
题目链接 LOJ:https://loj.ac/problem/3057 洛谷:https://www.luogu.org/problemnew/show/P5292 Solution 先膜一发\(m ...
- 【洛谷5292】[HNOI2019] 校园旅行(思维DP)
点此看题面 大致题意: 给你一张无向图,每个点权值为\(0\)或\(1\),多组询问两点之间是否存在一条回文路径. 暴力\(DP\) 首先,看到\(n\)如此之小(\(n\le5000\)),便容易想 ...
- bzoj5492:[Hnoi2019]校园旅行
传送门 %%%myy 考虑30分做法:暴力bfs,\(f[i][j]\)表示\(i\)到\(j\)可以形成回文串 然而为什么我场上只想到了70分做法,完全没想到30分怎么写.. 100分: 考虑缩边, ...
- [HNOI2019]校园旅行(建图优化+bfs)
30分的O(m^2)做法应该比较容易想到:令f[i][j]表示i->j是否有解,然后把每个路径点数不超过2的有解状态(u,v)加入队列,然后弹出队列时,两点分别向两边搜索边,发现颜色一样时,再修 ...
- Loj #3057. 「HNOI2019」校园旅行
Loj #3057. 「HNOI2019」校园旅行 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你 ...
随机推荐
- wap开发体会<转载>
前二天因工作需要,上头要求做一个wap版的网站,到网上学习了一天,弄了个beta版出来(http://wap.luckty.com 功能很一般),整理几点经验如下: 1.wap网站用的是wml标识,非 ...
- 每日集成CruiseControl.NET + SVN + Msbuild + NAnt
CruiseControl.NET-1.8.4.0-Setup.exe 是服务器,安装时可以选择生成windows service以便开启,建议测试时不用windows se ...
- C#中资源文件的使用
在程序中会用到图片,有两种方法,一种是将图片放在运行文件夹中,直接调用,另一种是将图片放入资源文件中. 方法一,一般在.exe文件同级创建文件夹,如“ico”,然后把图标放进去.在程序中代码采用相对路 ...
- PHP函数addslashes和mysql_real_escape_string的区别
转自:http://www.jb51.net/article/49205.htm 这篇文章主要介绍了PHP函数addslashes和mysql_real_escape_string的区别,以及一个 ...
- Boss Group Worker Group NioEventLoopGroup
宜人贷蜂巢API网关技术解密之Netty使用实践 - honeycomb2017的博客 - CSDN博客 https://blog.csdn.net/honeycomb2017/article/det ...
- 【转载】为什么不常见include .c文件
备:对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h 对于#include “filename.h” ,编译器从用户的工作 ...
- getResource()和getResourceAsStream以及路径问题(转)
用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file ...
- requests和bs4
requests模块,仿造浏览器发送Http请求bs4主要对html或xml格式字符串解析成对象,使用find/find_all查找 text/attrs 爬取汽车之家 爬取汽车之家的资讯信息,它没有 ...
- Python高级特性(2):Closures、Decorators和functools(转)
原文:Python高级特性(2):Closures.Decorators和functools 装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过 ...
- Jersey 出现415 MediaType is not supported问题的原因
前段时间在使用jersey的时候,经常碰到这个问题,一直没有找到真正的原因.找了其他的解决访问,比如使用jackson以及手动转为json再返回给前端. 后续发现问题出在domain对象属性类型和se ...