BZOJ4466 [Jsoi2013]超立方体
Description
定义“超立方图”为:有\(2^k\)个点,以\(k\)位二进制数编号,两个点之间有边当且仅当它们的编号恰有一位不同。给出一个图,问它是否与“超立方图”同构。如果是,输出任意一种点与点的对应方案。(\(n \leq 32768\))
Solution
先判断点数和边数、每个点的度数。
之后假设同构,求出同构方案后再check一遍。
显然超立方图的每个点都是对称的,于是我们任取一个点作为0,与它相邻的\(k\)个点编号为\(2^i, i=0\dots k-1\)。
之后,所有与\(0\)距离为\(2\)的点一定恰好与两个距离为\(1\)的点连边,且它的编号为这两个点编号的bit or。
与\(0\)距离为\(3\)的点的编号是所有与它相连的已知编号的点(距离一定是\(2\))的bit or。
以此类推。bfs一遍即可。
最后不要忘记check。
Code
#include <algorithm>
#include <cstdio>
#include <cstring>
const int N = 33000;
const int M = 2000050;
int pre[N], nxt[M], to[M], cnt, deg[N];
int A[N], que[N];
bool vis[N];
inline void addEdge(int x, int y) {
++deg[x];
nxt[cnt] = pre[x];
to[pre[x] = cnt++] = y;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m, x, y;
scanf("%d%d", &n, &m);
int k = 1;
while ((1 << k) < n) ++k;
memset(pre, -1, sizeof pre);
memset(deg, 0, sizeof deg);
cnt = 0;
while (m--) {
scanf("%d%d", &x, &y);
addEdge(x, y);
addEdge(y, x);
}
bool ok = true;
for (int i = 0; i < n; ++i)
ok = ok && deg[i] == k;
if (!ok) { puts("-1"); continue; }
memset(A, 0, sizeof A);
memset(vis, 0, sizeof vis);
int hd = 0, tl = 0;
vis[0] = true;
for (int i = pre[0], j = 1; ~i; i = nxt[i], j <<= 1)
A[que[tl++] = to[i]] = j;
while (hd < tl) {
int x = que[hd++];
vis[x] = true;
for (int i = pre[x]; ~i; i = nxt[i])
if (!vis[to[i]]) {
if (!A[to[i]]) que[tl++] = to[i];
A[to[i]] |= A[x];
}
}
memset(vis, 0, sizeof vis);
for (int i = 0; i < n; ++i) vis[A[i]] = true;
for (int i = 0; i < n; ++i) ok = ok && vis[i];
if (!ok) { puts("-1"); continue; }
for (int i = 0; i < n; ++i) {
for (int j = 0; j < k; ++j) vis[A[i] ^ (1 << j)] = false;
for (int j = pre[i]; ~j; j = nxt[j]) vis[A[to[j]]] = true;
for (int j = 0; j < k; ++j) ok = ok && vis[A[i] ^ (1 << j)];
}
if (!ok) { puts("-1"); continue; }
for (int i = 0; i < n; ++i)
printf("%d ", A[i]);
puts("");
}
}
BZOJ4466 [Jsoi2013]超立方体的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj4466 超立方体
Description 超立方体是立方体在高维空间内的拓展(其在 2 维情况下退化为正方形,1维情况下退化成线段).在理论计算机科学领域里,超立方体往往可以和 2 进制编码联系到一起.对理论计算机科学 ...
- bzoj 4459: [Jsoi2013]丢番图 -- 数学
4459: [Jsoi2013]丢番图 Time Limit: 10 Sec Memory Limit: 64 MB Description 丢番图是亚历山大时期埃及著名的数学家.他是最早研究整数系 ...
- bzoj 4465: [Jsoi2013]游戏中的学问
4465: [Jsoi2013]游戏中的学问 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 121 Solved: 59[Submit][Statu ...
- [Bzoj5177][Jsoi2013]贪心的导游(主席树)
5177: [Jsoi2013]贪心的导游 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 32 Solved: 15[Submit][Status] ...
- BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数
BZOJ_4459_[Jsoi2013]丢番图_数学+分解质因数 Description 丢番图是亚历山大时期埃及著名的数学家.他是最早研究整数系数不定方程的数学家之一. 为了纪念他,这些方程一般被称 ...
- 「JSOI2013」贪心的导游
「JSOI2013」贪心的导游 传送门 多次询问区间内%一个数的最大值 我们不妨设这个数为M_sea 值域比较小所以考虑分块维护. 我们观察到对于给定的一个 \(p\) ,函数 \(y = x \% ...
- 「JSOI2013」哈利波特和死亡圣器
「JSOI2013」哈利波特和死亡圣器 传送门 首先二分,这没什么好说的. 然后就成了一个恒成立问题,就是说我们需要满足最坏情况下的需求. 那么显然在最坏情况下伏地魔是不会走回头路的 因为这显然是白给 ...
- 「JSOI2013」侦探jyy
「JSOI2013」侦探jyy 传送门 个人感觉我写的复杂度不够优秀啊,但是好像没有别的办法了... 我们枚举每个点,考虑这个点能不能不发生. 首先我们从这个点开始,在反图上面 \(\text{BFS ...
随机推荐
- mysql 1093 - You can't specify target table 'xx表' for update in FROM clause
为了修复节点表某批次数据的用户数据,做出了以下尝试: , name , , )); 执行:[Err] 1093 - You can't specify target table 'zs_work_ap ...
- elasticsearch Geo Distance Query
Geo Distance Query 过滤器文档只包括在一个特定距离内存在于一个地理点上的命中.假设下列映射和索引文档: PUT /my_locations { "mappings" ...
- PHP之旅8 URL与表单
表单 表单的出现让用户和后台主机有了直接的交互,网站开始变的‘动态起来’,在HTML的各个标记符中,与PHP关系最为紧密的要属表单标记符了,常见的表单标记符有<form>.<inpu ...
- 学习Python中的集合
创建集合 使用工厂方法 set()和 frozenset(): >>> s = set('cheeseshop') >>> s set(['c', 'e', 'h' ...
- SpringMVC整合kaptcha(验证码功能)
一.依赖 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha& ...
- postgresql-数据库网络地址存储探索
问题背景 数据库审核过程中发现有存储ip的字段类型为varchar(50).想到postgresql有专门的存储ip类型.然而存在即合理.所以主要对比varchar和inet存储ip的不同. 网络地址 ...
- 移动端页面模板viewport
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <meta nam ...
- docker微服务部署之:六、Rancher管理部署微服务
docker微服务部署之:五.利用DockerMaven插件自动构建镜像 一. 什么是Rancher Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源 ...
- tensorflow进阶篇-3
#-*- coding:utf-8 -*- #Tensorflow的嵌入Layer import numpy as np import tensorflow as tf sess=tf.Session ...
- Linux的帮助文档命令
Linux的帮助文档命令 1.man page man是manual(操作手册)的简写,使用方式: man [指令] man date 在显示的内容中查找内容: / + 搜索你的关键字 上下左右键来查 ...