DeBruijin HDU - 2894
原题链接
考察:欧拉回路(?)
思路:
每个点\(u\)与\(a = (u<<1)\&((1<<n)-1),a+1\)有一条有向边,也就是每个点的入度 = 出度 = 2.必然存在欧拉回路,\(dfs\)即可
但是看了网上的题解都没说为啥可以这样\(dfs\),这里如果遇到遍历后的点回退,这个点与上一个遍历过的点一定有边相连,感觉很神奇,但是其他题解都没提到,本蒟蒻也不知道为啥(.)
Code
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int N = 12;
int n,ans[(1<<N)+10],cnt;
bool st[1<<N];
void dfs(int u)
{
int a = (u<<1)&((1<<n)-1);
if(!st[a])
{
st[a] = 1;
dfs(a);
ans[++cnt] = a&1;
}
if(!st[a+1])
{
st[a+1] =1;
dfs(a+1);
ans[++cnt] = a+1&1;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(st,0,sizeof st);
cnt = 0;
dfs(0);
printf("%d ",1<<n);
for(int i=1;i<n;i++) printf("0");
for(int i=cnt;i>=n;i--) printf("%d",ans[i]);
printf("\n");
}
return 0;
}