Codeforces 325E

Codeforces 325E

原题
题目描述:给出(n)个点, 编号为(0 ext ~ n-1),每个点连出两条边分别为(2i)(2i+1)((mod n)),现从(0)出发,最后回到(0),且每个点必须且只到达一次((0)为两次),输出一条可行路径。

solution
能发现(2i=2(i+n/2)(mod n), 2i+1=2(i+n/2)+1(mod n)),那就可以把(i)((i+n/2))看做一个点,原图变成一个(n/2)(n)边图,每条边都要经过一次,也就是欧拉回路,然后搜索求解就好了。

code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <map>
#include <set>
using namespace std;

const int maxn=int(1e5)+100;

int n, sum;
int route[maxn];
bool vis[maxn];

void dfs(int cur)
{
	if (vis[cur]) return;
	vis[cur]=true;
	dfs((cur*2)%n);
	dfs((cur*2+1)%n);
	route[++sum]=cur;
}
void solve()
{
	dfs(0);
	for (int i=sum; i>0; --i) printf("%d ", route[i]);
	printf("0
");
}
int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	scanf("%d", &n);
	if (n & 1) printf("-1
");
	else solve();
	return 0;
}

原文地址:https://www.cnblogs.com/GerynOhenz/p/4972672.html