Description

超立方体是立方体在高维空间内的拓展(其在 2 维情况下退化为正方形,1
维情况下退化成线段)。在理论计算机科学领域里,超立方体往往可以和 2 进制
编码联系到一起。对理论计算机科学颇有研究的 Will 自然也会对超立方体有着
自己的思考。 

上图就是在 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 超立方体的更多相关文章

  1. BZOJ4466 [Jsoi2013]超立方体

    Description 定义"超立方图"为:有\(2^k\)个点,以\(k\)位二进制数编号,两个点之间有边当且仅当它们的编号恰有一位不同.给出一个图,问它是否与"超立方 ...

  2. 拉丁超立方体初始化种群(附Matlab代码)

    拉丁超立方体初始化种群 1.引言 群智能算法一般以随机方式产生初始化种群的位置,但是这种方式可能导致种群内个体分布不均匀.拉丁超立方体抽样方法产生的初始种群位置,可以保证全空间填充和抽样非重叠,从而使 ...

  3. 从BSP模型到Apache Hama

    一.什么是BSP模型 概述 BSP(Bulk Synchronous Parallel,整体同步并行计算模型)是一种并行计算模型,由英国计算机科学家Viliant在上世纪80年代提出.Google发布 ...

  4. lecture11-hopfiled网络与玻尔兹曼机

    Hinton课程第11课 这部分的课程算是个知识背景,讲述RBM的来源吧,毕竟是按照hopfield--BM-RBM的路线过来的. 因为水平有限,都是直译,如果纠结某句话,肯定看不懂,所以这些课程只需 ...

  5. HTML标签简明学习一

    !-- ... -- html注释 浏览器不对其中的内容解析,可以用来调试及书写释意 <!-- 动不动就被注释 --> !DOCTYPE 声明文件类型 一般大写,必须位于文档首行,浏览器根 ...

  6. 斯坦福大学CS224d基础1:线性代数回顾

    转自 http://blog.csdn.net/han_xiaoyang/article/details/51629242 斯坦福大学CS224d基础1:线性代数知识 作者:Zico Kolter ( ...

  7. 什么是超级立方体,HyperCube

    我试试用我的方式说说如何构造n维空间吧. n维空间在n大于3后,说要画出来,有点难以想象.但从数学的角度看,高维空间这个概念还算比较普通.容易理解的. 与其解释,不如快快开始.我选择用图(Graph) ...

  8. BZOJ3823 : 定情信物

    n维超立方体有$2^{n-i}C_n^i$个i维元素,于是$O(n)$预处理出1到n的逆元,再$O(n)$计算即可. 注意Trick:P可能小于n,所以要将数字表示成$a\times P^b$的形式. ...

  9. OLAP 模型

    OLAP分析的基础是多维数据集,按照其数据存储格式的不同可以分为关系型OLAP(Relational OLAP,ROLAP)和多维型OLAP(Multidimensional OLAP,MOLAP). ...

随机推荐

  1. Nginx反向代理缓冲区优化

    内容目录 proxy_buffering proxy_buffer_size proxy_buffers proxy_busy_buffers_size proxy_max_temp_file_siz ...

  2. 【安装】Nginx安装

    系统平台:CentOS release 6.5 (Final) 64位. 安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool ...

  3. Bzoj1101: [POI2007]Zap 莫比乌斯反演+整除分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 莫比乌斯反演 1101: [POI2007]Zap 设 \(f(i)\) 表示 \(( ...

  4. AJAX,JSON,GSON

    AJAX将数据使用JSON格式发送给后端Servlet或其他语言解析. 对JSON内容使用GSON外扩展包进行分解,并使用(如查询用户名是否已经被注册), 最后使用Map集合设置新的返回状态码,并使用 ...

  5. CSU 1963 Feed the rabbit(斜率优化dp)

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1963 题意:有m个坑,每只兔子会在ti时刻回到坑中,现在有n个人,每个人都可以从任意时间(&l ...

  6. BooStrap4文档摘录 2 Content, Component

    Content Reboot:从新写了主要元素的排列. 本章讲了各种元素及其相关的类. ⚠️ 文档左上角有搜索栏. Components Alert✅ Badge✅ Button✅和Button gr ...

  7. UVA-129 Krypton Factor(回溯)

    题目大意:由字母A到Z组成的字符串,其中有两个子串完全相同的叫做容易的串,反之叫困难的串.找出由前L个字母组成的第n个困难的串. 题目分析:简单回溯,不过要判断是否存在重复子串比较棘手.<入门经 ...

  8. UVA-1149 Bin Packing (贪心)

    题目大意:给定n个物品的重量,无限个容量为m的箱子,每个箱子最多装两个物品,要把所有的物品都装下,最少需要多少个箱子. 题目分析:贪心策略:每次将最重和最轻的两个物品放到一个箱子里,如果装不下,则将最 ...

  9. LeetCode 48

    这种方法首先对原数组取其转置矩阵,然后把每行的数字翻转可得到结果,如下所示(其中蓝色数字表示翻转轴): 1  2  3  1  4  7  7  4  1 4  5  6 -->  2  5   ...

  10. windows使用git记录

    1.免密码clone远程服务器代码开启ssh 生成私钥公钥 命令:查看自己配置的邮箱 git config user.name git config user.email 生成密钥:邮箱填写上面查看出 ...