首页 > 其他分享 >POJ 1780 Code (欧拉回路+非递归版dfs)

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

时间:2023-04-13 23:42:31浏览次数:52  
标签:head Code 1780 tt cnt dfs int edge include


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

#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;
#pragma comment(linker, "/STACK:102400000,102400000")
#define LL long long
#define pi acos(-1.0)
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double eqs=1e-9;
int head[110000], vis[1100000], path[1100000], cnt, a[10], top, stk[1100000], ww[1100000];
struct node {
        int u, v, w, next;
} edge[1100000];
void add(int u, int v, int w)
{
        edge[cnt].v=v;
        edge[cnt].w=w;
        edge[cnt].next=head[u];
        head[u]=cnt++;
}
void dfs(int u)
{
        int i, tt=0,w;
        stk[++tt]=u;
        ww[tt]=0;
        while(tt){
                u=stk[tt];
                for(i=head[u];i!=-1;i=edge[i].next){
                        if(!vis[edge[i].w]){
                                vis[edge[i].w]=1;
                                stk[++tt]=edge[i].v;
                                ww[tt]=edge[i].w;
                                head[u]=edge[i].next;
                                break;
                        }
                }
                if(i==-1){
                        path[top++]=ww[tt];
                        tt--;
                }
        }
}
void init()
{
        memset(head,-1,sizeof(head));
        cnt=top=0;
        memset(vis,0,sizeof(vis));
}
int main()
{
        int n, i, j, tot, tmp;
        a[0]=1;
        for(i=1; i<=6; i++) a[i]=a[i-1]*10;
        while(scanf("%d",&n)!=EOF&&n) {
                if(n==1) {
                        puts("0123456789");
                        continue ;
                }
                init();
                tot=a[n-1];
                for(i=0;i<tot;i++){
                        tmp=i%a[n-2]*10;
                        for(j=9;j>=0;j--){
                                add(i,tmp+j,i*10+j);
                        }
                }
                vis[0]=1;
                dfs(0);
                for(i=1;i<n;i++) printf("0");
                for(i=top-1;i>=0;i--){
                        printf("%d",path[i]%10);
                }
                puts("");
        }
        return 0;
}


标签:head,Code,1780,tt,cnt,dfs,int,edge,include
From: https://blog.51cto.com/u_16070138/6188684

相关文章

  • Codeforces Round #289 Div. 2 解题报告 A.B.C.E
    A-MaximuminTable纯递推。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<map>#include<set>#include<stdio.h>usingn......
  • Codeforces Round #290 (Div. 2) 解题报告 A.B.C.D.
    A-FoxAndSnake模拟。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<map>#include<set>#include<stdio.h>usingnames......
  • Codeforces Round #287 (Div. 2) 解题报告 A.B.C.D.E
    这次的CF挺水的,当时B题犯了一个很SB的错误,浪费了好多时间,所以D和E也没来得及看。sad,。。A-AmrandMusic水题,从小的开始选。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<map>......
  • Codeforces Round #286 (Div. 2) C题 Mr. Kitayuta, the Treasure Hunter (DFS+记忆化D
    题目地址:http://codeforces.com/contest/505/problem/C从d点开始,每个点都有三个方向,形成了一棵树,那么就从跟结点开始进行dfs查找,dp数组记录当前的点和长度,当这两个条件相同的时候,显然,后面的子树是完全相同的,于是用记忆化来优化。代码如下:#include<iostream>#include<string.h>#......
  • codeforces #185 A Plant(矩阵快速幂+递推)
    题目地址:http://codeforces.com/problemset/problem/185/A通过这个题终于找回了点找递推公式的信心。。TAT。。不过真心感觉CF的题目质量都真不错。。。首先,第n个图形的上方,左下方,右下方的三个大三角形是跟第n-1个是一模一样的,所以是3*f(n-1)。然后只剩下中间一个倒着的大三角形了,......
  • 剑指 Offer 09. 用两个栈实现队列 && leetcode225.用队列实现栈
     剑指Offer09.用两个栈实现队列 classCQueue{private:stack<int>inStack,outStack;voidin2out(){//这里必须是while循环,如果是if判断,则输出栈日常只有一个值,没有起到先入后出的作用while(!inStack.empty()){//将输入栈栈顶......
  • PdfSharpCore是MIT开源协议
    PdfSharpCore是MIT开源协议,不过他依赖Sixlabors.Fonts和Sixlabors.ImageSharp库,Sixlabors已经修改了协议,https://sixlabors.com/pricing/上面的说明是:IfyouareconsuminganySixLaborslibrariesasaDirectPackageDependencyforusageinClosedSourcesoftwareinthe......
  • leetcode:路径总和 III
    问题描述给定一个二叉树的根节点root ,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例1输入:root=[10,5,-3,3,2,null,11,3,-2,null,1],ta......
  • Codeforces Round #286 (Div. 1) B. Mr. Kitayuta's Technology (强连通分量)
    题目地址:http://codeforces.com/contest/506/problem/B先用强连通判环,然后转化成无向图,找无向图连通块,若一个有n个点的块内有强连通环,那么需要n条边,即正好首尾相连形成一条环,那么有了这个环之后,在这个块内的所有要求都能实现。如果没有强连通环,那么就是一棵树,那么只需要n-1条边即......
  • Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana (分块)
    题目地址:http://codeforces.com/contest/551/problem/E将n平均分成sqrt(n)块,对每一块从小到大排序,并设置一个整体偏移量。修改操作:l~r区间内,对两端的块进行暴力处理,对中间的整体的块用整体偏移量标记增加了多少。时间复杂度:O(2*sqrt(n)+n/sqrt(n)).查询操作:对每一块二分,查找......