POJ 1392 Ouroboros Snake (欧拉回路)

来源:互联网 发布:java求最大公约数算法 编辑:程序博客网 时间:2024/04/29 13:42

题目地址:poj1392
欧拉回路水题。
代码如下:

#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>using namespace std;#define LL long long#define pi acos(-1.0)const int mod=1e9+7;const int INF=0x3f3f3f3f;const double eqs=1e-9;int path[17][1<<17], top[17], vis[1<<17], head[1<<17], cnt;struct node{        int u, v, next;}edge[1<<18];void add(int u, int v){        edge[cnt].v=v;        edge[cnt].next=head[u];        head[u]=cnt++;}void dfs(int u, int f){        for(int i=head[u];i!=-1;i=edge[i].next){                int v=edge[i].v;                if(!vis[v]){                        vis[v]=1;                        dfs(v,f);                }        }        path[f][top[f]++]=u;}void init(){        memset(head,-1,sizeof(head));        cnt=0;        memset(vis,0,sizeof(vis));}int main(){        int i, j, n, k, h, x, y;        //freopen("2.txt","w",stdout);        memset(top,0,sizeof(top));        for(i=1;i<=15;i++){                init();                x=1<<i;                y=1<<i-1;                for(j=0;j<x;j++){                        if(j<y){                                add(j,j<<1|1);                                add(j,j<<1);                        }                        else{                                add(j,(j-y)<<1|1);                                add(j,(j-y)<<1);                        }                }                vis[0]=1;                dfs(0,i);        }        while(scanf("%d%d",&n,&k)!=EOF&&n+k){                printf("%d\n",path[n][top[n]-1-k]);        }        return 0;}
0 0
原创粉丝点击