$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=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
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,,(int)q[u].size()-)
{
Rg int v=q[u][i];
if(v==fa)continue;
dfs1(v,u);
}
}
il bool dfs2(int u,int fa)
{
vis[u]=;
go(i,,(int)q[u].size()-)
{
Rg int v=q[u][i];
if(v==fa)continue;
if(vis[v]){h[++ct1]=(node){u,v};return ;}
if(dfs2(v,u)){h[++ct1]=(node){u,v};return ;}
}
return ;
}
il void dfs3(int u,int fa)
{
as[++ct]=u;
go(i,,(int)q[u].size()-)
{
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,,m)b[i]=(node){read(),read()};
go(i,,m)q[u(i)].push_back(v(i)),q[v(i)].push_back(u(i));
go(i,,n)sort(q[i].begin(),q[i].end());
if(m==n-)
{
dfs1(,);
go(i,,ct)printf("%d ",as[i]);
return ;
}
vis[]=;dfs2(,);
go(i,,ct1)if(h[i].v==h[].v){ct1=i-;break;}
go(i,,ct1)
{
x=h[i].u,y=h[i].v;ct=;
dfs3(,);
if(ans[]==)go(i,,n)ans[i]=as[i];
else
{
bool fl=;
go(j,,ct)
if(as[j]<ans[j]){fl=;break;}
else if(as[j]>ans[j]){break;}
if(fl)go(j,,n)ans[j]=as[j];
}
}
go(i,,n)printf("%d ",ans[i]);
return ;
}

随机推荐

  1. ImportError: No module named libqt_gui_cpp_shiboken

    在使用 rosrun rqt_publisher rqt_publisher 调用ROS图形化界面的过程中出现: 而且在使用图像化界面添加/cmd_vel时,无法添加,命令窗口显示“段错误”. 在网上 ...

  2. UIImageView xib里面拉伸图片技巧

    拉伸图片的时候代码里和xib里面的图片名字去掉@2x,但是原始图片文件得要xxx@2x.png The X and Y values seem to be the positions for the ...

  3. HDU 1071

    题意:就是求给你一个抛物线的三个点,第一个给定的点是抛物线的顶点,让你求直线p2p3与抛物线的定积分 思路:因为题目条件给了顶点,所以直接用抛物线的顶点式去求. 本弱弱数学太差.还得复习一下公式 #i ...

  4. 深入理解 Embedding层的本质

    继上文https://blog.csdn.net/weixin_42078618/article/details/82999906探讨了embedding层的降维效果,时隔一个月,分享一下嵌入层在NP ...

  5. SpringData Jpa、Hibernate、Jpa 三者之间的关系

    JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架--因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...

  6. Innodb_large_prefix

    innodb_large_prefix Prefixes, defined by the length attribute, can be up to 767 bytes long for InnoD ...

  7. 关于后台动态模板添加内容的总结 Builder使用

    1.后台控制器中ArticleController中加载 formBuilder,listBuilder类: 2.实例化FormBuilder对象,调用类中的方法: 3.初始化时加载Builder/f ...

  8. H3C RIP基本配置

  9. linux 后备缓存

    一个设备驱动常常以反复分配许多相同大小的对象而结束. 如果内核已经维护了一套相同 大小对象的内存池, 为什么不增加一些特殊的内存池给这些高容量的对象? 实际上, 内核 确实实现了一个设施来创建这类内存 ...

  10. linux /proc 接口

    无论何时一个硬件中断到达处理器, 一个内部的计数器递增, 提供了一个方法来检查设备 是否如希望地工作. 报告的中断显示在 /proc/interrupts. 下面的快照取自一个双处理 器 Pentiu ...