经典欧拉回路应用——旋转鼓轮模型
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典欧拉回路应用——旋转鼓轮模型相关的知识,希望对你有一定的参考价值。
hdu2894
csdn上的题解感觉一模一样。。都没讲明白结点用几位数来构造。。然后自己瞎画了半天
题目给定的k,要求数字是k位数,那么我们就要用k-1位数来构造结点,剩下一位数用来在边上进行转移(这一步很重要,博客上几乎没讲到)
当k=3 时,我们构造出四个点 00,01,10,11,每个点有两条出边,两条入边,把这个图用欧拉回路跑一遍,跑出来的答案就是对应的答案
#include<iostream> #include<cstdio> #include<cstring> #define CLR(arr,val) memset(arr,val,sizeof(arr)) using namespace std; const int N=15; int k,cnt; int ans[1<<N]; bool vis[1<<N]; void init(){ CLR(vis,false); CLR(ans,0); cnt=0; } void euler(int st) { int s1=(st<<1)&((1<<k)-1); int s2=s1+1; if (!vis[s1]){ vis[s1]=1; euler(s1); ans[++cnt]=0; cout<<s1<<" "<<st<<‘ ‘; } if (!vis[s2]) { vis[s2]=1; euler(s2); ans[++cnt]=1; cout<<s2<<" "<<st<<‘ ‘; } } int main(){ while(~scanf("%d",&k)){ init(); euler(0); printf("%d ",cnt); //因为要求字典序最小,所以前k位都是0(前导零) for(int i=1;i<k;i++){ printf("0"); } for(int i=cnt;i>=k;i--){ printf("%d",ans[i]); } printf(" "); } return 0; }
poj1780 增强版
看这篇博客就行
https://www.cnblogs.com/GraceSkyer/p/5759348.html
以上是关于经典欧拉回路应用——旋转鼓轮模型的主要内容,如果未能解决你的问题,请参考以下文章