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;
}
posted @ 2021-07-16 13:48  acmloser  阅读(23)  评论(0编辑  收藏  举报