$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. laravel进阶系列--通过事件和事件监听实现服务解耦

    简介 Laravel 事件提供了简单的观察着模式实现,允许你订阅和监听应用中的事件.事件类通常存放在 app/Events 目录. 监听器存放在 app/Listeners. 如果你在应用中没有看到这 ...

  2. pytorch源码解析:Python层 pytorchmodule源码

    尝试使用了pytorch,相比其他深度学习框架,pytorch显得简洁易懂.花时间读了部分源码,主要结合简单例子带着问题阅读,不涉及源码中C拓展库的实现. 一个简单例子 实现单层softmax二分类, ...

  3. day5-python之递归与二分法

    一.递归的定义 递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用 二.递归分为两个阶段:递推,回溯 age(5) = age(4) + 2 age(4) = ag ...

  4. Datanodes-心跳机制

  5. laravel 验证码手机与提交手机的验证?

    假如我用自己的手机号码获得了验证码,然后在点击提交之前,更换了手机号一栏的input,用一个比如18888888888的手机号进行注册,用之前得到的验证码,是不是会出现注册成功的情况?是否应该考虑验证 ...

  6. mysql数据库之表和库

    SQL:语句主要用于存储数据,查询数据,更新数据和管理关系数据库系统SQL语言有IBM开发,sql语言分为中类型: 1.DDL语句 数据库定义语句:数据库,表,视图,索引,存储过程,例如create, ...

  7. day5_python之subprocess模块

    subprocess作用:用来执行系统命令它会开启一个子进程,通过子进程去执行一些命令 读取正确的命令执行结果,如果没有指定把结果输出到哪里,默认打印到屏幕上 #subprocess.Popen(r' ...

  8. win10提示 磁盘包含不是“PARTITION_BASIC_DATA_GUID"类型的分区

    在win10创建新的磁盘分区的时候,有时候会提示 磁盘包含不是"PARTITION_BASIC_DATA_GUID"类型的分区 如果你试了其他方法都不凑效,那么看看你已经有几个盘( ...

  9. 各种浏览器怎么换ip

    https://jingyan.baidu.com/article/e4d08ffdb784050fd2f60ddd.html 方法/步骤   1 用浏览器搜索ip,得到自己当前的ip. 2 用浏览器 ...

  10. HDU 1596 也是最小路径Dijkstra

    #include<cstdio> #include<cmath> #include<cstring> +; double dist[qq]; double city ...