poj 1780 code(欧拉路)

/*
对于n为密码想要序列最短 那么 1234 2345 这两个一定挨着
就是说 前一个的后n-1位是后一个的前n-1位 假设n==3
我们用0-99作为点的编号建图 然后每个点连出去10条边
两个相邻点有n-1个是重复的 边的权值可用两个点计算
比如 12 23 权值为123  123 234 权值为1234
显然最后的序列是每个边记录一次 也就是跑欧拉路
对于记录下的边权 第一条输出前n-1为 上下的输出最后一位
这就是答案了 poj上没有special judge 要求字典序最小
这里建边时从9-0 就ok了
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
using namespace std;
int n,m,num,head[maxn],s[maxn],len;
int S[maxn],top,f[maxn],T[maxn];
struct node
{
    int u,v,t,pre;
}e[maxn*2];
void Clear()
{
    num=len=top=0;
    memset(head,-1,sizeof(head));
    memset(head,-1,sizeof(head));
    memset(f,0,sizeof(f));
}
void Add(int from,int to,int dis)
{
    e[num].v=to;
    e[num].t=dis;
    e[num].pre=head[from];
    head[from]=num++;
}
void Dfs(int x)
{
    S[++top]=x;T[top]=0;
    while(top)
      {
          int u=S[top],falg=0,ti=T[top];
          for(int i=head[u];i!=-1;i=e[i].pre)
            {
                int v=e[i].v;
                if(f[e[i].t])continue;
                falg=1;f[e[i].t]=1;
                S[++top]=v;T[top]=e[i].t;
                break;
          }
        if(!falg)s[++len]=ti,top--;
      }
}
int main()
{
    while(scanf("%d",&n)&&n)
      {
          Clear();
          if(n==1){puts("0123456789");continue;}
          int t=1,r=1;
          for(int i=1;i<n;i++)t*=10,r*=10;r/=10;
          for(int i=0;i<t;i++)
            for(int j=9;j>=0;j--)
              Add(i,i%r*10+j,i*10+j);
          Dfs(0);
          for(int i=1;i<=n-2;i++)printf("0");
          printf("%d",s[len]/10);
          for(int i=len-1;i>=1;i--)printf("%d",s[i]%10);
          printf("\n");
      }
}
时间: 2024-10-10 01:57:33

poj 1780 code(欧拉路)的相关文章

POJ - 1780 Code (欧拉回路+手写DFS)

Description KEY Inc., the leading company in security hardware, has developed a new kind of safe. To unlock it, you don't need a key but you are required to enter the correct n-digit code on a keypad (as if this were something new!). There are severa

POJ 1780 Code 欧拉回路+手写栈DFS

和西安邀请赛那道题题目差不多,现在终于会手写栈了,自己琢磨了好久,真是感动TAT #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdli

POJ 1780 Code

记录欧拉路径. 题意很难懂.英语渣,翻译半天不得要领.看PDF的中文才知道题意. 题意:给一个 N (1<=N<=6)找出字典序最短的所有数字组合都出现的序列. 给出了N=2 的例子.就拿这个说明,太长就说前面的. 00102030405060708091121314151617181922324252627282933435363738394454647484955657585966768697787988990 00 出现了,01出现,然后 10,02,20,03,30,04,40,05,

[欧拉回路+手动开栈] poj 1780 Code

题目链接: http://poj.org/problem?id=1780 Code Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2037   Accepted: 751 Description KEY Inc., the leading company in security hardware, has developed a new kind of safe. To unlock it, you don't need

POJ 1780 Code (欧拉回路+非递归版dfs)

题目地址:POJ 1780 还是求序列的欧拉回路.只不过这题有两坑. 第一坑是用数字来当点的话,会MLE,因为每个数字可以连10条边,100w条边会MLE,即使用vector也会TLE.这题可以用边来记录,对于n为1时直接输出,然后后面的,比如12,23这两个点就用边权值为123来表示这两个点,这样就把点和边的范围都缩小了10倍. 第二坑是用递归的dfs会爆栈,亲测即使加手扩栈也会爆..(简直丧心病狂..)需要用非递归版dfs,也不难,dfs本身就是利用的栈,所以改成栈的形式就可以了. 代码如下

POJ 1780 Code(欧拉通路)

输入n(1<=n<=6),输出长度为10^n + n -1 的字符串答案. 其中,字符串以每n个为一组,使得所有组都互不相同,且输出的字符串要求字典序最小. 显然a[01...(n-1)]和a[12...n]为相邻组,可以看做有一条边从结点a[01...(n-1)]到结点a[12...n]. 题目转化成求欧拉通路.如果以每组的值为结点,则有10^6个结点,10^7条边.会MLE.(此时其实是哈密顿通路?) 这里以每组的值为边的边权,而边的2个结点分别是前n-1位数和后n-1位数.这样点是10^

poj 2337(单向欧拉路的判断以及输出)

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11648   Accepted: 3036 Description A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For

poj 1392 构造欧拉路遍历所有可能

http://poj.org/problem?id=1392 其实就是构造一个最小的数字序列,使得每n位都是一个数字,而且不重复 比如n=2  序列是00110   两个两个看就是00--0  01---1 11--3 10--2 先总结知识: 1.k进制下,这样的序列长度是k^n+n-1. 首先第一个数长度是n,后面k^n -1个数,每个数只需要增加一位就行了,所以是k^n+n-1. 2.最小 我开始的时候按回溯写,WA,然后把vis[ s ]=0注释掉 AC,不是很明白为什么,再做几题作总结

图论--欧拉路,欧拉回路(小结)

在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路,问需要走几次才能将所有的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边只能走一次,且要遍历所有的边,简单的说就是一笔画(图连通) 这道题是无向图的欧拉路,无向图的欧拉路的判定:所有点的度数都是偶数度,或者只有两个点的度是奇数度,且图要是连通图 知道欧拉路是什么后,这题就比较好做了,第一件事就是找到有几个连通块,然后再判断一下每个连通块需要几笔才能完成就好了 #include <cs