zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    AD 文档信息设置和制作模板
    用AT命令调试调制解调器
    语音AT命令参考
    传真AT指令部分(参考)
    传真调制解调器
    knockout+weui+zepto
    20171028随手记
    20171027随记
    一些简单又坑人的无聊使用
    ReadWrite,日志,输入文本
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/4972672.html
Copyright © 2011-2022 走看看