$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. struts.xml中的结果类型与视图

    实际上在Struts2框架中,一个完整的结果视图配置文件应该是: ? 1 2 3 4 5 <action name="Action名称" class="Action ...

  2. Java之Socket与HTTP区别

    我们都知道TCP/IP协议共分四层: ① 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节. ...

  3. webpack详述

    一.利用package.json执行打包任务 首先使用npm init生成package.json文件:然后配置scripts如下: "scripts": { "buil ...

  4. H3C 无线网络典型部署-热点覆盖

  5. rowStyle设置Bootstrap Table行样式

    日常开发中我们通常会用到隔行变色来美化表格,也会根据每行的数据显示特定的背景颜色,如果库存低于100的行显示红色背景 CSS样式 <style> .bg-blue { background ...

  6. H3C 总线型以太网拓扑扩展

  7. java什么是跨平台性?原理是什么?

    所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行. 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行 ...

  8. 快速理解bootstrap,bagging,boosting,gradient boost-三个概念

      1 booststraping:意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法. 其核心思想和基本步骤如下: (1 ...

  9. 2018-8-10-VisualStudio-自定义外部命令

    title author date CreateTime categories VisualStudio 自定义外部命令 lindexi 2018-08-10 19:16:53 +0800 2018- ...

  10. 【js】vue 2.5.1 源码学习 (十一) 模板编译compileToFunctions渲染函数

    大体思路(九) 本节内容: 1. compileToFunctions定位 1. compileToFunctions定位 ==> createCompiler = createCompiler ...