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


     

     

    光伴随的阴影
  • 相关阅读:
    Power BI for Office 365(八)共享查询
    Power BI for Office 365(七) Power BI站点
    Power BI for Office 365(六)Power Map简介
    Power BI for Office 365(五)Power View第二部分
    Power BI for Office 365(四)Power View第一部分
    Power BI for Office 365(三)Power Pivot
    Power BI for Office 365(二)Power Query
    java 继承、重载、重写与多态
    Android 热修复方案Tinker(一) Application改造
    阿里最新热修复Sophix与QQ超级补丁和Tinker的实现与总结
  • 原文地址:https://www.cnblogs.com/forward777/p/11402841.html
Copyright © 2011-2022 走看看