首页 > 其他 > 详细

DeBruijin HDU - 2894

时间:2021-07-16 15:13:23      阅读:21      评论:0      收藏:0      [点我收藏+]

原题链接
考察:欧拉回路(?)
思路:
??每个点\(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;
}

DeBruijin HDU - 2894

原文:https://www.cnblogs.com/newblg/p/15019717.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!