欧拉路径 提高篇 hiho第51周

题目链接:hiho 第51周

思路:首先特判n=1的情况,无输出。对于其他的按有向欧拉路径的求法把欧拉路径求出来以后,第一个按位全输出,接下来的的(2^n-1)个点,只需要输出二进制最后一位就可以了。详细的思路参考hiho 第51周

/**************************************************************
    Problem:hiho 第51周
    User: youmi
    Language: C++
    Result: Accepted
    Time:17ms
    Memory:1MB
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <sstream>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pt(a) printf("%d\n",a)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;

int n;
int mod;
int bit[20];
const int maxn=40000;
int head[maxn],euler[maxn],vis[maxn];
int T,tot;
struct side
{
    int v,next;
}e[maxn];
void init()
{
    tot=T=0;
    zeros(vis);
    ones(head);
}
void build(int u,int  v)
{
    //printf("%d %d\n",u,v);
    e[T].v=v;
    e[T].next=head[u];
    head[u]=T++;
}
void dfs_side(int u)
{
    vis[u]=1;
    int v=(u<<1)%mod;
    build(u,v);
    if(!vis[v])
        dfs_side(v);
    v=v+1;
    build(u,v);
    if(!vis[v])
        dfs_side(v);
}
void dfs(int u)
{
    //pt(u);
    euler[++tot]=u;
    for(int i=head[u];~i;i=e[i].next)
    {
        int v=e[i].v;
        if(!vis[i])
        {
            vis[i]=1;
            dfs(v);
        }
    }
}
void getbit()
{
    int p=1;
   rep1(i,20)
   {
       bit[i]=p;
       p<<=1;
   }
}
int main()
{
    //freopen("in.txt","r",stdin);
    getbit();
    while(~scanf("%d",&n))
    {
        init();
        if(n==1)
        {
            printf("\n");
            continue;
        }
        mod=(1<<(n-1));
        dfs_side(0);
        zeros(vis);
        dfs(0);
        /**<rep1(i,tot)
            printf("%d ",euler[i]);
        putchar(‘\n‘);*/
        for(int j=n-1;j>=1;j--)
        {
            if(euler[1]&bit[j])
                    printf("1");
                else
                    printf("0");
        }
        for(int i=2;i<=tot-(n-1);i++)
        {
            if(euler[i]&1)
                printf("1");
            else
                printf("0");
        }
        putchar(‘\n‘);
    }
    return 0;
}
时间: 2024-12-21 23:37:16

欧拉路径 提高篇 hiho第51周的相关文章

欧拉路径 基础题 hiho第49周

题目链接:hiho 第49周 思路: 定义:给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 性质:  1: 一个无向图存在欧拉路当且仅当该图是连通的且有且只有2个点的度数是奇数,此时这两个点只能作为欧拉路径的起点和终点.  2: 若图中没有奇数度的点,那么起点和终点一定是同一个点,这样的欧拉路叫做欧拉回路 利用性质做题就好了,具体的模拟hiho讲的非常清楚了 /****************************************************

Git操作(提高篇)

Git操作(提高篇) 分支管理 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了.如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险.有了分支,就不用怕了.创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次

Java提高篇——对象克隆(复制)

阅读目录 为什么要克隆?如何实现克隆浅克隆和深克隆解决多层克隆问题总结 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况. 但是如果你复制的是一个对象,情况就有些复杂了. 假设说我是一个beginner,我会这样写: class Student { private int number; pu

Java提高篇——Java实现多重继承

阅读目录 一. 接口二.内部类 多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需要思考的不是怎么使用多重继承,而是您的设计是否存在问题.但有时候我们确实是需要实现多重继承,而且现实生活中也真正地存在这样的情况,比如遗传:我们即继承了父亲的行为和特征也继承了母亲的行为和特征.可幸的是Java是非常和善和理解我们的,它提供了两种方式让我们曲折来实现多

【转】java提高篇(二)-----理解java的三大特性之继承

[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句话中最引人注目的是"复用代码",尽可能的复用代码使我们程序员一直在追求的,现在我来介绍一种复用代码的方式,也是java三大

Gradle提高篇之一——文件操作

Gradle提高篇之一——文件操作 Gradle提高篇之二——依赖管理 Gradle提高篇之二——理解SourceSet Gradle提高篇之四——构建大型Java项目 Gradle提高篇之五——发布与部署

Maven提高篇系列之(五)——处理依赖冲突

这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) Maven提高篇系列之(三)——使用自己Repository(Nexus) Maven提高篇系列之(四)——使用Profile Maven提高篇系列之(五)——处理依赖冲突 Maven提高篇系列之(六)——编写自己的Plugin(本系列完) 在本系列的上一篇文章中,我们讲到了如何使用Profile

Maven提高篇系列之(四)——使用Profile

这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) Maven提高篇系列之(三)——使用自己Repository(Nexus) Maven提高篇系列之(四)——使用Profile Maven提高篇系列之(五)——处理依赖冲突 Maven提高篇系列之(六)——编写自己的Plugin(本系列完) 在开发项目时,设想有以下场景: 你的Maven项目存放在

Maven提高篇系列之(三)——使用自己Repository(Nexus)

这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) Maven提高篇系列之(三)——使用自己Repository(Nexus) Maven提高篇系列之(四)——使用Profile Maven提高篇系列之(五)——处理依赖冲突 Maven提高篇系列之(六)——编写自己的Plugin(本系列完) 平时我们自己做的项目都是直接使用Maven提供的Cent