$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. Flask学习之七 单元测试

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing 中文翻译地址:http ...

  2. Lambda plus: 云上大数据解决方案

    本文会简述大数据分析场景需要解决的技术挑战,讨论目前主流大数据架构模式及其发展.最后我们将介绍如何结合云上存储.计算组件,实现更优的通用大数据架构模式,以及该模式可以涵盖的典型数据处理场景. 大数据处 ...

  3. Kafka数据迁移MaxCompute最佳实践

    摘要: 本文向您详细介绍如何使用DataWorks数据同步功能,将Kafka集群上的数据迁移到阿里云MaxCompute大数据计算服务. 前提条件 搭建Kafka集群 进行数据迁移前,您需要保证自己的 ...

  4. ReactDOM & DOM Elements

    一.ReactDOM 1.1 render() ReactDOM.render(element,container,[callback]) 在container中渲染一个React元素,然后返回组件一 ...

  5. POJ3080 Blue Jeans 题解 KMP算法

    题目链接:http://poj.org/problem?id=3080 题目大意:给你N个长度为60的字符串(N<=10),求他们的最长公共子串(长度>=3). 题目分析:KMP字符串匹配 ...

  6. SuperSocket 日志接口

    SuperSocket的日志功能非常简单,你几乎可以在任何地方都能记录日志. AppServer 和 AppSession 都有Logger属性, 你可以直接用它来记录日志. 以下代码演示了日志接口的 ...

  7. 数据存储在哪里? Java是值传递还是引用传递?

    寄存器 : 最快的存储区,位于处理器中,寄存器会按需求自行分配空间,java不能控制寄存器,所以在程序中感觉不到它的存在 栈(stack) : 位于RAM(内存)中,速度仅次于寄存器,存储对象的引用( ...

  8. PHP Warning: Module 'json' already loaded in Unknown on line 0

    Zend加密文件.启动服务器后无法正常运行加密后的文件.处理方法:   某台服务器上跑着php 5.3.8,线上服务运行正常. 某天拆分php错误日志时,发现其中有一段连续的错误信息. [14-Feb ...

  9. HTML5中Js多线程编程

    Web Worker Web Worker是HTML5提出的新标准,为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Work ...

  10. java 反射的概念

    反射的引入: Object obj = new Student(); 若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法: 1.若编译和运行类型 ...