bzoj4466 超立方体
Description
超立方体是立方体在高维空间内的拓展(其在 2 维情况下退化为正方形,1
维情况下退化成线段)。在理论计算机科学领域里,超立方体往往可以和 2 进制
编码联系到一起。对理论计算机科学颇有研究的 Will 自然也会对超立方体有着
自己的思考。 .png)
上图就是在 0~4 维空间内超立方体所对应的图形。显然我们可以把超立方
体的每个顶点看成一个点,每一条棱看成一条边,这样就会得到一个无向图,我
们称之为超立方图。
D维空间内的超立方图有 2D个点,我们把这些点从0到2D-1依次编号。
有一个有趣而重要的充要结论是:一定存在一种编号的方式,使得图中任意
两个有边相连的顶点的编号的 2进制码中,恰好有一位不同。
在 2维和3维空间内这个结论可以这样形象的理解:
对于 2维空间,我们只要把这个正方形放到第一象限内,使得 4个顶点的坐
标按逆时针顺序依次为(0,0),(1,0),(1,1),(0,1),然后再把坐标看成 2位2进制
数,依次将这 4个点编号为 0,1,3,2即可。
对于 3维空间,同样我们可以将立方体的一个顶点与原点重合,并使得所有
棱均平行于坐标轴,然后分别确定这8个点的坐标,最后把3维空间内的坐标看
成一个3位2进制数即可。对于D维空间,以此类推。
现在对于一个 N 个点M条边的无向图(每个点从 0到N-1编号),Will 希望
知道这个图是否同构于一个超立方图。
Input
第一行包含一个整数 Q表示此数据中一共包含 Q个询问。
接下来 Q组询问,每一组询问的输入格式如下:
第一行包含两个整数 N 和M,
接下来 M 行,每行 2 个不同的整数 x,y,表示图中存在一条无向边连接编
号为x和y的点(0 < = x,y < N)
Q<=3,N<=32768,M<=1000000
Output
对于每一个询问分别输出一行,内容如下:
1、如果询问中给定的图不同构于任何一个超立方图,输出-1;
2、如果同构于某一个超立方图,那么请给图中这N 个点重新编号,并在这
一行输出 N 个用空格隔开的整数,表示原图中每个点新的编号,使得重新编号
后,满足题目中所述的结论。
注意:输出文件的每一行,要么仅包含一个整数-1,要么则应包含一个由 0
到N-1这 N 个数组成的排列。如果有多组解输出任意一个均可。
一个超立方体图满足:
1.每个顶点有相同度数k
2.共2k个顶点,k2k-1条边
3.标号后任意边两端标号二进制表示只相差1位
4.每个点相邻的所有点的标号与这个点标号不同的二进制位互不相同
不符合1.2.直接输出-1,符合1.2.的可以先bfs一次得到标号并验证标号是否合法(标号不重复且符合3.4.)
bfs时,任取一个点标号0,其相邻点标号为2的幂,取未标号且与已标号点相邻的点,将其标号为相邻已标号点的标号的按位或值
#include<cstdio>
inline int input(){
int x=,c=getchar();
while(c>||c<)c=getchar();
while(c>&&c<)x=x*+c-,c=getchar();
return x;
}
const int N=;
int id[N],rs[N],ed[N];
int e[][N],p[N],dc[N+];
int q[N],ql=,qr=;
int n,m,a,b;
void chk(){
n=input();
m=input();
bool un=;
ql=qr=;
int D=dc[n];
if(n==&&m==){
puts("");
return;
}
if(!D||m*!=n*D)un=;
if(!un)
for(int i=;i<N;i++)p[i]=ed[i]=id[i]=rs[i]=;
while(m--){
a=input(),b=input();
if(p[a]>=D||p[b]>=D)un=;
if(un)continue;
e[p[a]++][a]=b;
e[p[b]++][b]=a;
}
ed[]=;
if(!un)
for(int i=;i<p[];i++){
int w=e[i][];
if(ed[w]){un=;break;}
ed[w]=;
q[qr++]=w;
id[w]=<<i;
}
if(!un)
while(ql<qr){
int w=q[ql++];
ed[w]=;
for(int i=;i<p[w];i++){
int u=e[i][w];
if(ed[u]==)continue;
id[u]|=id[w];
if(!ed[u]){
ed[u]=;
q[qr++]=u;
}
}
}
if(!un)
for(int i=;i<n;i++){
if(rs[id[i]]){un=;break;}
rs[id[i]]=i;
}
if(!un)
for(int i=;i<n&&!un;i++){
int s=;
for(int j=;j<p[i];j++){
int u=e[j][i];
int c=id[u]^id[i];
if(s&c){un=;break;}
if(c!=(c&-c)){un=;break;}
s|=c;
}
if(s+!=n)un=;
}
if(un)puts("-1");
else{
printf("%d",id[]);
for(int i=;i<n;i++)printf(" %d",id[i]);
putchar();
}
}
int main(){
for(int i=;i<;i++)dc[<<i]=i;
int T=input();
while(T--)chk();
return ;
}
bzoj4466 超立方体的更多相关文章
- BZOJ4466 [Jsoi2013]超立方体
Description 定义"超立方图"为:有\(2^k\)个点,以\(k\)位二进制数编号,两个点之间有边当且仅当它们的编号恰有一位不同.给出一个图,问它是否与"超立方 ...
- 拉丁超立方体初始化种群(附Matlab代码)
拉丁超立方体初始化种群 1.引言 群智能算法一般以随机方式产生初始化种群的位置,但是这种方式可能导致种群内个体分布不均匀.拉丁超立方体抽样方法产生的初始种群位置,可以保证全空间填充和抽样非重叠,从而使 ...
- 从BSP模型到Apache Hama
一.什么是BSP模型 概述 BSP(Bulk Synchronous Parallel,整体同步并行计算模型)是一种并行计算模型,由英国计算机科学家Viliant在上世纪80年代提出.Google发布 ...
- lecture11-hopfiled网络与玻尔兹曼机
Hinton课程第11课 这部分的课程算是个知识背景,讲述RBM的来源吧,毕竟是按照hopfield--BM-RBM的路线过来的. 因为水平有限,都是直译,如果纠结某句话,肯定看不懂,所以这些课程只需 ...
- HTML标签简明学习一
!-- ... -- html注释 浏览器不对其中的内容解析,可以用来调试及书写释意 <!-- 动不动就被注释 --> !DOCTYPE 声明文件类型 一般大写,必须位于文档首行,浏览器根 ...
- 斯坦福大学CS224d基础1:线性代数回顾
转自 http://blog.csdn.net/han_xiaoyang/article/details/51629242 斯坦福大学CS224d基础1:线性代数知识 作者:Zico Kolter ( ...
- 什么是超级立方体,HyperCube
我试试用我的方式说说如何构造n维空间吧. n维空间在n大于3后,说要画出来,有点难以想象.但从数学的角度看,高维空间这个概念还算比较普通.容易理解的. 与其解释,不如快快开始.我选择用图(Graph) ...
- BZOJ3823 : 定情信物
n维超立方体有$2^{n-i}C_n^i$个i维元素,于是$O(n)$预处理出1到n的逆元,再$O(n)$计算即可. 注意Trick:P可能小于n,所以要将数字表示成$a\times P^b$的形式. ...
- OLAP 模型
OLAP分析的基础是多维数据集,按照其数据存储格式的不同可以分为关系型OLAP(Relational OLAP,ROLAP)和多维型OLAP(Multidimensional OLAP,MOLAP). ...
随机推荐
- Java加密代码 转换成Net版
java版本自己封装base64 package com.qhong; import java.io.UnsupportedEncodingException; import org.apache.c ...
- UVA 12338 Anti-Rhyme Pairs(hash + 二分)题解
题意:给出两个字符串的最大相同前缀. 思路:hash是要hash,不hash是不可能的.hash完之后从头遍历判断超时然后陷入沉默,然后告诉我这能二分orz,二分完就过了,写二分条件写了半天.不要用数 ...
- PostgreSql 其它客户端连接
在 PATH_TO_YOUR_PostGreSQL/data/pg_hba.conf 加上红色那行,重启postgre的service就能让其它人连你的数据库了. host all all 127.0 ...
- MaintainableCSS 《可维护性 CSS》 --- 约定篇
约定 可维护的CSS具有以下约定: .<module>[-<component>][-<state>] {} 根据所讨论的模块,方括号是可选的.这里有些例子: /* ...
- 转 CentOS 7 minimal 版本安装后网络配置
转自[http://www.07net01.com/2016/01/1140061.html] 1.首先使用root登录服务器,输入 nmcli d 我们发现网卡是处于禁用状态. 2.打开网络管理器界 ...
- run jdeveloper, unable to create an instance of the Java Virtual Machine Located at path:
刚才打开 jdevW.exe 时提示如下错误: Unable to create an instance of the Java Virtual MachineLocated at path:x:\x ...
- springboot 用mybatis-generator自动生成bean和dao
1.在pom.xml里添加maven插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifac ...
- HALCON之喷码OCR识别案例
一个喷码识别的案例 1 read_image (Image, 'D:/用户目录/Desktop/2.png') 2 3 rgb1_to_gray(Image, Image) 4 5 get_image ...
- HP-UX 下用户被锁
/usr/lbin/getprpw -m lockout root 如果返回lockout=0000000 该帐号是非锁定的,如果是其它的如:lockout=0001000则表示该帐号被锁定 如果是测 ...
- iis6手工创建网站后无法运行php脚本
给人搬了十几个网站,老站用西部数码建站助手创建的,现在过期了无法继续创建,只能在Internet 信息服务(IIS)管理器创建网站,创建下来都没问题,但是就是无法打开网站. 测试打开txt文档.静态页 ...