• 欧拉路径 提高篇 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
    ",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
    ",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("
    ");
                continue;
            }
            mod=(1<<(n-1));
            dfs_side(0);
            zeros(vis);
            dfs(0);
            /**<rep1(i,tot)
                printf("%d ",euler[i]);
            putchar('
    ');*/
            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('
    ');
        }
        return 0;
    }
    不为失败找借口,只为成功找方法
  • 相关阅读:
    简单计算器(栈和队列的应用)
    01背包问题(dfs+剪枝)
    PAT1057 stack(分块思想)
    算法笔记求序列A每个元素左边比它小的数的个数(树状数组和离散化)
    求序列A中每个数的左边比它小的数的个数(树状数组)
    ubuntu-创建python虚拟环境
    vue-打包
    django-项目目录结构
    接口自动化-常见工具
    selenium-封装一个browser
  • 原文地址:https://www.cnblogs.com/youmi/p/4609030.html
Copyright © 2020-2023  润新知