欧拉路径 提高篇 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;
}

 

你可能感兴趣的:(路径)