[HNOI2019]校园旅行(建图优化+bfs)
30分的O(m^2)做法应该比较容易想到:令f[i][j]表示i->j是否有解,然后把每个路径点数不超过2的有解状态(u,v)加入队列,然后弹出队列时,两点分别向两边搜索边,发现颜色一样时,再修改答案,加入队列即可。
100分是挺难想的,是个思维题,可以把边分成连接同色和异色两种。发现走过的路径一定是若干同色连通块拼接而成,除了中间的连通块外,其余长度均相等。对于长度,如果短,可以反复走把长度走到相等,重点是奇偶性要相同。所以,我们能够联想和二分图有关的东西。异色连通块,很显然是二分图,于是我们可以直接建立生成树。而同色的,如果是二分图则无需改变奇偶性,也连成一棵树。反之,则在树上连个自环即可,这样可以改变奇偶性。复杂度O(n^2)。据说HNOI今年卡栈,写dfs的都爆零?算了AH已经不和HN联考也不管了,反正OJ上过了……
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pii;
const int N=,M=1e6+;
int n,m,Q,cnt,fa[N],hd[N],v[M],nxt[M],col[N];
char str[N];
bool f[N][N];
vector<int>G[N];
queue<pii>q;
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void add(int x,int y){v[++cnt]=y,nxt[cnt]=hd[x],hd[x]=cnt;}
bool dfs(int u,int c)
{
col[u]=c;
bool ret=;
for(int i=;i<G[u].size();i++)
if(col[G[u][i]]==-)
{
add(u,G[u][i]),add(G[u][i],u);
ret|=dfs(G[u][i],c^);
f[u][G[u][i]]=f[G[u][i]][u]=;
q.push(pii(min(u,G[u][i]),max(u,G[u][i])));
}
else if(col[G[u][i]]==c)ret=;
return ret;
}
int main()
{
scanf("%d%d%d",&n,&m,&Q);
scanf("%s",str+);
for(int i=;i<=n;i++)fa[i]=i;
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(str[x]==str[y])G[x].push_back(y),G[y].push_back(x);
else{
int u=find(x),v=find(y);
if(u!=v)fa[u]=v,add(x,y),add(y,x);
}
}
memset(col,-,sizeof col);
for(int i=;i<=n;i++)if(col[i]==-&&dfs(i,))add(i,i);
for(int i=;i<=n;i++)f[i][i]=,q.push(pii(i,i));
while(!q.empty())
{
int x=q.front().first,y=q.front().second;
q.pop();
for(int i=hd[x];i;i=nxt[i])
for(int j=hd[y];j;j=nxt[j])
if(str[v[i]]==str[v[j]]&&!f[v[i]][v[j]])
f[v[i]][v[j]]=f[v[j]][v[i]]=,q.push(pii(min(v[i],v[j]),max(v[i],v[j])));
}
while(Q--)
{
int x,y;scanf("%d%d",&x,&y);
if(f[x][y])puts("YES");else puts("NO");
}
}
[HNOI2019]校园旅行(建图优化+bfs)的更多相关文章
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 『The Captain 最短路建图优化』
The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...
- [HNOI2019]校园旅行(构造+生成树+动规)
题目 [HNOI2019]校园旅行 做法 最朴素的做法就是点对扩展\(O(m^2)\) 发现\(n\)比较小,我们是否能从\(n\)下手减少边数呢?是肯定的 单独看一个颜色的联通块,如果是二分图,我们 ...
- BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化
我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...
- 【洛谷5292】[HNOI2019] 校园旅行(思维DP)
点此看题面 大致题意: 给你一张无向图,每个点权值为\(0\)或\(1\),多组询问两点之间是否存在一条回文路径. 暴力\(DP\) 首先,看到\(n\)如此之小(\(n\le5000\)),便容易想 ...
- [LOJ3057] [HNOI2019] 校园旅行
题目链接 LOJ:https://loj.ac/problem/3057 洛谷:https://www.luogu.org/problemnew/show/P5292 Solution 先膜一发\(m ...
- BZOJ4205卡牌配对——最大流+建图优化
题目描述 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不 ...
- 2018.08.29 NOIP模拟 table(拓扑排序+建图优化)
[描述] 给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的.现在需要你 来做出一些调整,使得每行都是非降序的.这个调整只能是整列的移动. [输入] 第一行两个正整数 N 和 M. 接下 ...
- bzoj5492:[Hnoi2019]校园旅行
传送门 %%%myy 考虑30分做法:暴力bfs,\(f[i][j]\)表示\(i\)到\(j\)可以形成回文串 然而为什么我场上只想到了70分做法,完全没想到30分怎么写.. 100分: 考虑缩边, ...
随机推荐
- React16 新特性
一.使用Error Boundary处理错误组件 React16之前:组件在运行期出错,会阻塞整个应用的渲染. React16之后:引入新的错误处理机制——Error Bounda ...
- 51nod 1346:递归
1346 递归 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 函数f(n,m) { 若n=1或m=1返回a[n][m]; 返回f(n-1,m)异或 ...
- 越南CTF的crypto 100
自己做CTF还是没有经验,本来以为crypto更多应该是python编程的,结果这个100的题目是Do you love Arithmetic? 打开文件来看内容是 # charset = " ...
- NRF24L01多对一、多通道通讯关键代码
要想24L01多通道通讯成功,务必先单通道调试成功,并且懂得这块芯片通讯的一些基本知识. 一.基本的通讯条件 1.接收端的接收地址(RX_ADDR_Px)等于发射端的发射送地址(TX_ADDR) ...
- 从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系
从 relu 的多种实现来看 torch.nn 与 torch.nn.functional 的区别与联系 relu多种实现之间的关系 relu 函数在 pytorch 中总共有 3 次出现: torc ...
- Python说文解字_Python之多任务_01
Python 之 多任务: Python之多任务是现在多任务编程运用Python语言为载体的一种体现.其中涵盖:进程.线程.并发等方面的内容,以及包括近些年在大数据运算.人工智能领域运用强大的GPU运 ...
- GRUB&MBR引导
(ubuntu下搜索gnome-disk可以打开磁盘管理) 简单开机过程 : ①按下电源后,计算机自检(POST),如果硬件设备(CPU.内存.硬盘.光驱.各种卡)都没有问题,BIOS会检查各个硬盘的 ...
- request对象和response对象的作用和相关方法
response对象(响应) 响应行 状态码 :setStatus(int a) 设置状态码 302重定向 304控制缓存 响应头 setHeader() 一个key对应一个value addHead ...
- HDU_2256 矩阵快速幂 需推算
最近开始由线段树转移新的内容,线段树学到扫描线这里有点迷迷糊糊的,有时候放一放可能会好一些. 最近突然对各种数学问题很感兴趣.好好钻研了一下矩阵快速幂.发现矩阵真是个计算神器,累乘类的运算原本要O(N ...
- hdu1232 城镇间修路(并查集)
问题是这样的: Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇 ...