zoukankan      html  css  js  c++  java
  • $Noip2018/Luogu5022$ 旅行

    $Luogu$

    $Description$

    一个$n$个点,$m$条边的图.$m=n-1$或$m=n$.任意选取一点作为起始点,可以去往一个没去过的点,或者回到第一次到达这个点时来自的点.要求遍历整个图,会得到一个遍历的点的序列(按照到达的先后顺序排).输出字典序最小的序列.

    $Sol$

    首先$m=n-1$也就是树的情况十分简单,选取$1$结点作为根,然后类似与$dfs$地往下遍历,只要每次选择子结点里字典序最小的那个走就好.$60get.$

    $m=n$,就是一个带一个环的树,显然有一条边一定不会被走到.所以只要枚举环里的一条边删去,然后按树的做就好了.

    $Code$

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    #define il inline
    #define Rg register
    #define go(i,a,b) for(Rg int i=a;i<=b;++i)
    #define yes(i,a,b) for(Rg int i=a;i>=b;--i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define u(i) b[i].u
    #define v(i) b[i].v
    #define ll long long
    #define db double
    #define inf 2147483647
    using namespace std;
    il int read()
    {
        Rg int x=0,y=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
        return x*y;
    }
    const int N=5010;
    int n,m,as[N],ans[N],tmp[N],ct,ct1,x,y;
    struct node{int u,v;}b[N],h[N];
    bool vis[N];
    vector<int>q[N];
    il void dfs1(int u,int fa)
    {
        as[++ct]=u;
        go(i,0,(int)q[u].size()-1)
        {
            Rg int v=q[u][i];
            if(v==fa)continue;
            dfs1(v,u);
        }
    }
    il bool dfs2(int u,int fa)
    {
        vis[u]=1;
        go(i,0,(int)q[u].size()-1)
        {
            Rg int v=q[u][i];
            if(v==fa)continue;
            if(vis[v]){h[++ct1]=(node){u,v};return 1;}
            if(dfs2(v,u)){h[++ct1]=(node){u,v};return 1;}
        }
        return 0;
    }
    il void dfs3(int u,int fa)
    {
        as[++ct]=u;
        go(i,0,(int)q[u].size()-1)
        {
            Rg int v=q[u][i];
            if(v==fa)continue;
            if(u==x && v==y)continue;
            if(u==y && v==x)continue;
            dfs3(v,u);
        }
    }
    int main()
    {
        n=read(),m=read();
        go(i,1,m)b[i]=(node){read(),read()};
        go(i,1,m)q[u(i)].push_back(v(i)),q[v(i)].push_back(u(i));
        go(i,1,n)sort(q[i].begin(),q[i].end());
        if(m==n-1)
        {
            dfs1(1,0);
            go(i,1,ct)printf("%d ",as[i]);
            return 0;
        }
        vis[1]=1;dfs2(1,0);
        go(i,2,ct1)if(h[i].v==h[1].v){ct1=i-1;break;}
        go(i,1,ct1)
        {
            x=h[i].u,y=h[i].v;ct=0;
            dfs3(1,0);
            if(ans[1]==0)go(i,1,n)ans[i]=as[i];
            else
            {
                bool fl=0;
                go(j,1,ct)
                    if(as[j]<ans[j]){fl=1;break;}
                    else if(as[j]>ans[j]){break;}
                if(fl)go(j,1,n)ans[j]=as[j];
            }
        }
        go(i,1,n)printf("%d ",ans[i]);
        return 0;
    }
    View Code


     

     

    光伴随的阴影
  • 相关阅读:
    C语言内存分析
    算法之快速排序
    单链表逆转
    C程序设计语言之一
    vim插件配置(一)
    makefile示例
    cocos2d基础入门
    Makefile
    Makefile
    GCC编译四阶段
  • 原文地址:https://www.cnblogs.com/forward777/p/11402841.html
Copyright © 2011-2022 走看看