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. POJ 2240 Arbitrage(判正环)

    http://poj.org/problem?id=2240 题意:货币兑换,判断最否是否能获利. 思路:又是货币兑换题,Belloman-ford和floyd算法都可以的. #include< ...

  2. SQL语句主要的分类

    SQL语言的命令通常分为四类1.数据定义语言(DDL) 创建.修改或删除数据库中各种对象,包括表.视图.索引等. 命令:CREATE TABLE , CREATE VIEW, CREATE INDEX ...

  3. Ubuntu server 禁止显示器休眠

    Linux不让显示器休眠的方法 # setterm -blank # setterm -blank n (n为等待时间)

  4. Solaris11 Vsphere client tool 的鼠标问题

    Mouse does not function on a Solaris 11 virtual machine (2040498) http://kb.vmware.com/selfservice/m ...

  5. Android 各API版本代码常量

    Android开发中常常有版本比较这个功能,来做版本兼容或者,其他相关效果等   以下是Android 7.0版本下的源码:   public static class VERSION_CODES { ...

  6. zoj-3329-期望/dp/方程优化

    One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very ...

  7. linux自建git仓库

    一 安装git,设置git用户(当前操作是root用户) 1.安装git yum install git 2.创建git用户 groupadd git useradd git -g git 3.创建证 ...

  8. vue 子组件把数据传递给父组件

    <div id="app"> <child v-on:drop='parent'></child> //这里v-on:drop="pa ...

  9. sgu 137. Funny Strings 线性同余,数论,构造 难度:3

    137. Funny Strings time limit per test: 0.25 sec. memory limit per test: 4096 KB Let's consider a st ...

  10. jQuery实现鼠标经过图片预览大图效果

    jQuery:是一种客户端的技术,它的诞生的理由是:write less,do more(写更少的代码,做更多的事情). 因此,我们可以借助jQuery来实现一些很酷炫的效果,相比于javaScrip ...