bzoj4466 超立方体

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=0,c=getchar();
    while(c>57||c<48)c=getchar();
    while(c>47&&c<58)x=x*10+c-48,c=getchar();
    return x;
}
const int N=32768;
int id[N],rs[N],ed[N];
int e[16][N],p[N],dc[N+1];
int q[N],ql=0,qr=0;
int n,m,a,b;
void chk(){
    n=input();
    m=input();
    bool un=0;
    ql=qr=0;
    int D=dc[n];
    if(n==1&&m==0){
        puts("0");
        return;
    }
    if(!D||m*2!=n*D)un=1;
    if(!un)
    for(int i=0;i<N;i++)p[i]=ed[i]=id[i]=rs[i]=0;
    while(m--){
        a=input(),b=input();
        if(p[a]>=D||p[b]>=D)un=1;
        if(un)continue;
        e[p[a]++][a]=b;
        e[p[b]++][b]=a;
    }
    ed[0]=1;
    if(!un)
    for(int i=0;i<p[0];i++){
        int w=e[i][0];
        if(ed[w]){un=1;break;}
        ed[w]=1;
        q[qr++]=w;
        id[w]=1<<i;
    }
    if(!un)
    while(ql<qr){
        int w=q[ql++];
        ed[w]=1;
        for(int i=0;i<p[w];i++){
            int u=e[i][w];
            if(ed[u]==1)continue;
            id[u]|=id[w];
            if(!ed[u]){
                ed[u]=2;
                q[qr++]=u;
            }
        }
    }
    if(!un)
    for(int i=0;i<n;i++){
        if(rs[id[i]]){un=1;break;}
        rs[id[i]]=i;
    }
    if(!un)
    for(int i=0;i<n&&!un;i++){
        int s=0;
        for(int j=0;j<p[i];j++){
            int u=e[j][i];
            int c=id[u]^id[i];
            if(s&c){un=1;break;}
            if(c!=(c&-c)){un=1;break;}
            s|=c;
        }
        if(s+1!=n)un=1;
    }
    if(un)puts("-1");
    else{
        printf("%d",id[0]);
        for(int i=1;i<n;i++)printf(" %d",id[i]);
        putchar(10);
    }
}
int main(){
    for(int i=0;i<16;i++)dc[1<<i]=i;
    int T=input();
    while(T--)chk();
    return 0;
}
时间: 2024-10-29 15:23:49

bzoj4466 超立方体的相关文章

学术-几何-维:超级立方体 (五维超级超立方体)

ylbtech-学术-几何-维:超级立方体 (五维超级超立方体) 五维超级超立方体即五维超级超正方体(超超立方体) 五维超级超立方体,在几何学中五维方体是立方体的五维类比,五维方体之于四维超立方体,四维超立方体之于立方体,就如立方体之于正方形. 1.返回顶部 1. 中文名:五维超级超立方体 2. 2.返回顶部 1. 维数序号:1 2 3 4 5维数代码:x y z t u边长:8焦点:该“超超立方体”的中心点(大家能明白的)旋转:x-y y-z z-t t-u x-u 均逆时针旋转20度 x-z

从BSP模型到Apache Hama

? 什么是BSP模型 概述 BSP(Bulk Synchronous Parallel,整体同步并行计算模型)是一种并行计算模型,由英国计算机科学家Viliant在上世纪80年代提出.Google发布的一篇论文(<Pregel: A System for Large-Scale Graph Processing>)使得这一概念被更多人所认识,据说在Google 80%的程序运行在MapReduce上,20%的程序运行在Pregel上.和MapReduce一样,Google并没有开源Pregel

Clustering by fast search and find of desity peaks(基于快速搜索与寻找密度峰值的聚类)

基于快速搜索与寻找密度峰值的聚类(Alex Rodriguez and Alessandro Laio) 摘要:聚类分析目的是基于元素之间的相似度对其进行分类,应用范围从天文学到生物信息学.文献计量学到模式识别.我们提出一种方法,思想基于簇中心具有比其邻居更大密度的特点以及与更大密度点之间有一个相对较大的距离(1.簇中心点有相对高的密度 2.簇中心点之间距离一般较大,即不同类别之间一般距离较远),这种思想形成了簇数目直观出现的聚类机制的基础,自动发现和排除异常点,同时在识别簇时,不用关心其形状和

20170119

延续前天的节奏,继续被虐: T1: 一道经典的最小割建模题目,题目大意是一个50*50的网格上,有一些只能向固定一个方向打的炮塔,每个炮塔的攻击不能重叠,问最大得分: 最小割建模,上次去HN集训的时候有这道题: 当时改题,不知什么原因被卡了: 又写一遍,dinic打错了一个变量: T2: 一个超立方体,给出各维的长度,给定s,求在这个超立方体内有多少体积的坐标和(二维即横纵坐标和,三维即xyz三维坐标和,以此类推)不超过s(给定): 容斥+dp: T3: bzoj3779 LCT+dfs序线段树

并行编程入门

目录 1. 并行编程简介 2. MapReduce 2.1 MapReduce简介 2.2 MapReduce框架 2.3 Hadoop介绍 2.4 Hadoop基本类 2.5 Hadoop编程实例 1.并行编程简介 1.1.并行编程作用,用途 商业用途,科学计算,大数据分析 1.2.并行编程兴起原因 目前的串行编程的局限性 使用的流水线等隐式并行模式的局限性 硬件的发展 1.3.并行算法设计原则步骤 a.分析问题 b.分解问题 其中分解方法有: 数据分解 递归分解 探测性分解 推测性分解 混合

【转】人工智能基本术语(中英文对照)

转自:http://blog.163.com/chenqingshuang_2/blog/static/54409195200710247110161/ 自适应交叉adaptive crossover 自适应变异adaptive mutation 等位基因allele 算术交叉arithmetic crossover 人工生命artificial life 装箱问题Bin Packing 二进制编码基因binary genes 边界变异boundary mutation 基因块假设,积木块假设b

维数诅咒

介绍 在这篇文章中,我们将讨论所谓的"维数的诅咒",并解释为什么在设计分类器时它是很重要的.以下各节我会提供这个概念直观的解释,并用一个由于维数灾难导致的过拟合例子图解说明. 考虑这样一个例子,我们有一组图像,其中每个表示猫或狗.我们想创建一个分类器,它能够自动识别狗和猫.要做到这一点,我们首先需要考虑每个对象类的描述,该描述可以用数字来表示.这样的数学算法,即分类器,可以用这些数字来识别对象.例如,我们可以认为猫和狗有不同的颜色.区分这两个类的一种可能描述可以由三个数字组成:平均红色

模式识别:非参数估计法之Parzen窗估计和k最近邻估计

本实验的目的是学习Parzen窗估计和k最近邻估计方法.在之前的模式识别研究中,我们假设概率密度函数的参数形式已知,即判别函数J(.)的参数是已知的.本节使用非参数化的方法来处理任意形式的概率分布而不必事先考虑概率密度的参数形式.在模式识别中有躲在令人感兴趣的非参数化方法,Parzen窗估计和k最近邻估计就是两种经典的估计法. 参考书籍:<模式分类> 作者:RichardO.Duda,PeterE.Hart,DavidG.Stork 一.基本原理 1.非参数化概率密度的估计 对于未知概率密度函

定情信物(bzoj 3823)

Description 都说程序员找不到妹子,可是无人知晓,三生石上竟然还刻着属于小 E 的一笔. 那一天,小 E 穷尽毕生的积蓄,赠与了妹子一个非同寻常的定情信物.那是一个小 小的正方体,但透过它,可以看到过去,可以洞彻天机. 这份信物仿佛一只深邃的眼.当看透它看似简单的外表后,深邃的内心却最是可以 叩击人的灵魂的.不出所料,妹子果然被这个信物超越空间的美所吸引. "易有太极,是生两仪,两仪生四象,四象生八卦.,八卦定吉凶,吉凶生大业." 这句箴言在其上得到了完美的诠释. 是的,这正