bzoj3033

 欧拉路,这题好神啊QAQ

显然选择的方案数有2^n种,因为每个点度数都为二所以肯定是一条欧拉路,

第二问直接爆搜即可...

————然而我并没有想到————

第一问我推出来了(别问我怎么推的,我说我是蒙的好么...)

然而第二问,我想的是先枚举2^n种01串

然后显然最前面n位是0000...,最后n位是1111....

之后将所有0000,1000,1100,1110,1111....全部加访问标记

然后从0000开始往后拼,找与当前串错一位中间n-1位全部相同的未访问的串中字典序最小的那个(其实只有两个QwQ~)

然后随便乱搞......

额好像这就是正解了,然而我并不知道这是欧拉路...果然我还是太弱了TAT……

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int Mx=1<<12;
int m,tot,ans[Mx];
bool vis[Mx];
bool find(int x,int num)
{
    if(vis[x]) return false;
    vis[x]=1; ans[num]=x>>(m-1);
    if(num==tot) return true;
    if(find((x<<1)&(tot-1),num+1)) return true;
    if(find((x<<1|1)&(tot-1),num+1)) return true;
    vis[x]=0; return false;
}
int main()
{
    scanf("%d",&m); tot=1<<m; printf("%d ",tot);
    find(0,1);
    for(int i=1;i<=tot;i++) printf("%d",ans[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/xiaoxubi/p/6147838.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值