码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj3033: 太鼓达人 欧拉路径

时间:2018-10-17 00:02:36      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:include   utc   并且   cpp   www   return   .com   char   online   

题目链接

bzoj3033: 太鼓达人

题解

对于k-1位点,k位二进制位边,将点的转移连起来
每个点的入度和出度相等并且全部是偶点
只需要在这个图中找字典序最小的欧拉回路
可以贪心地找字典序较小的边,然后实在不行了就回溯

代码

#include<cstdio> 
#include<cstring> 
#include<algorithm> 
#define rep(p,x,k) for(int p = x;p <= k;++ p) 
#define per(p,x,k) for(int p = x;p >= k;-- p) 
#define gc getchar()
#define pc putchar 
#define LL long long  
inline LL read() {
    LL x = 0,f = 1; 
    char c = gc; 
    while(c < '0' || c > '9') c = gc; 
    while(c <= '9' && c >= '0') x = x * 10 + c -'0',c = gc; 
    return x ; 
} 
void print(LL x) { 
    if(x < 0) { 
        pc('-'); 
        x = -x; 
    } 
    if(x >= 10) print(x / 10); 
    pc(x % 10 + '0'); 
} 
int m,l; 
bool vis[100007]; 
int ans[100007]; 
bool dfs(int s,int k) { 
    if(vis[s]) return 0; 
    if(k == l) return 1;  
    vis[s] = 1; 
    ans[k] = s & 1; 
    if (dfs((s << 1) & (l - 1), k + 1) )return 1; 
    if (dfs((s << 1 | 1) & (l - 1),k + 1)) return 1; 
    vis[s] = 0; 
    return 0; 
} 
int main() { 
    m = read(); 
    print(l = 1 << m); 
    pc(' '); 
    dfs(0,1); 
    for(int i = 1;i < m;++ i) pc('0'); 
    for(int i = 1;i <= l - m + 1;++ i) pc(ans[i] + '0');        
    return 0; 
} 

bzoj3033: 太鼓达人 欧拉路径

标签:include   utc   并且   cpp   www   return   .com   char   online   

原文地址:https://www.cnblogs.com/sssy/p/9800777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!