题目链接

m=n-1是直接按字典序dfs就行,

m=n时是一棵基环树,我们发现当一个点在环上时,可以把它和它的一个在环上的儿子之间的边删掉,然后回溯,到达它的第一个有其他儿子的祖先的另一个儿子上,我们只需要记录一个点的第一个有其他儿子的祖先的其他儿子的最小值,贪心就行了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std; const int MAXN=500010;
const int MAXM=1000010; inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
} int n,m;
int Head[MAXN],num;
struct Edge{
int x,to,next;
}e[MAXM];
inline void add(int x,int y){
e[++num]=(Edge){x,y,Head[x]};Head[x]=num;
e[++num]=(Edge){y,x,Head[y]};Head[y]=num;
} int t[MAXM],cnt;
void sortedge(){
for(int i=1;i<=n;++i){
cnt=0;
for(int j=Head[i];j;j=e[j].next)
t[++cnt]=e[j].to;
sort(t+1,t+1+cnt);
for(int k=Head[i],j=1;k;k=e[k].next,++j)
e[k].to=t[j];
}
} int ans[MAXN],tot;
bool vis[MAXN],onc[MAXN],flag=1; void dfs1(int x){
ans[++tot]=x;vis[x]=1;
for(int i=Head[x];i;i=e[i].next){
int v=e[i].to;
if(vis[v])continue;
dfs1(v);
}
} int cym;
int find(int x,int fa){
vis[x]=1;
for(int i=Head[x];i;i=e[i].next){
int v=e[i].to;
if(v==fa)continue;
if(vis[v]){
cym=v;
onc[v]=onc[x]=1;
return 1;
}
int t=find(v,x);
if(t==1){
onc[v]=onc[x]=1;
if(cym==x)return -1;
else return 1;
}
if(t==-1)return -1;
}
return 0;
} inline int get_nxt(int i){
for(i=e[i].next;i;i=e[i].next)
if(!vis[e[i].to]) return e[i].to;
return -1;
} void dfs2(int x,int fa,int mi){
if(vis[x]) return;
ans[++tot]=x; vis[x]=1;
for(int i=Head[x];i;i=e[i].next){
int v=e[i].to;
if(vis[v]) continue;
if(flag&&onc[v]&&v>mi&&get_nxt(i)==-1){
flag=0; return;
}
int nxt=get_nxt(i);
if(!onc[x]) nxt=-1;
dfs2(v,x,nxt==-1?mi:nxt);
}
} void init(){
n=read();m=read();
int x,y;
for(int i=1;i<=m;++i){
x=read();y=read();
add(x,y);
}
sortedge();
} int main()
{
init();
if(m==n-1) dfs1(1);
else{
find(1,0);
memset(vis,0,sizeof(vis));
dfs2(1,0,0x3f3f3f3f);
}
for(int i=1;i<=n;++i)
printf("%d ",ans[i]);
return 0;
}

【洛谷P5049】旅行(数据加强版)的更多相关文章

  1. [codevs1048]石子归并&[codevs2102][洛谷P1880]石子归并加强版

    codevs1048: 题目大意:有n堆石子排成一列,每次可合并相邻两堆,代价为两堆的重量之和,求把他们合并成一堆的最小代价. 解题思路:经典区间dp.设$f[i][j]$表示合并i~j的石子需要的最 ...

  2. 洛谷 P5022 旅行

    今天换标题格式了,因为感觉原版实在有点别扭…… 还是直接上题板,看完题再讲吧: 对了有个小细节没说,m一定是等于n或者等于n-1的. 这题是2018年提高组的真题哦!被我肝了2天肝出来了,2天……(真 ...

  3. 洛谷 P6031 - CF1278F Cards 加强版(推式子+递推)

    洛谷题面传送门 u1s1 这个推式子其实挺套路的吧,可惜有一步没推出来看了题解 \[\begin{aligned} res&=\sum\limits_{i=0}^ni^k\dbinom{n}{ ...

  4. 洛谷 P1515 旅行

    P1515 旅行 题目描述 你要进行一个行程为7000KM的旅行,现在沿途有些汽车旅馆,为了安全起见,每天晚上都不开车,住在汽车旅馆,你手里现在已经有一个旅馆列表,用离起点的距离来标识,如下: 0, ...

  5. 洛谷——P2082 区间覆盖(加强版)

    P2082 区间覆盖(加强版) 题目描述 已知有N个区间,每个区间的范围是[si,ti],请求出区间覆盖后的总长. 输入输出格式 输入格式: N s1 t1 s2 t2 …… sn tn 输出格式: ...

  6. 洛谷P1137 旅行计划

    P1137 旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市,并制 ...

  7. 洛谷 P1137 旅行计划

    旅行计划 待证明这样dp的正确性. #include <iostream> #include <cstdio> #include <cstring> #includ ...

  8. 洛谷——P1137 旅行计划

    https://www.luogu.org/problem/show?pid=1137 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出 ...

  9. 洛谷P5022 旅行 题解

    前面几个代码都是部分分代码,最后一个才是AC了的,所以最后一个有详细注释 安利一发自己的Blog 这是提高组真题,233有点欧拉回路的感觉. 题目大意: 一个 连通 图,双向边 ,无重边 , 访问图中 ...

随机推荐

  1. EgretWing链接微信开发工具调试问题

    EgretWing链接微信开发工具调试问题 EgretWing 编译器支持持三种调试模式,Node.js .Chrome .EgretWing 扩展开发. 开发过程中会遇到工具配置错误. 这就需要在E ...

  2. Spring-Cloud之Eureka注册与发现-2

    一.Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCloud将它集成在其 ...

  3. 在docker容器上如何实现代码的版本管理

    之前在一台centos7的虚拟机上部署了docker并运行了三个容器给开发写代码用,写代码肯定会涉及到版本控制管理. 开始建议是开发在容器中写代码,然后通过docker commit的方式将其保存为i ...

  4. python基础知识(二)

    python基础知识(二) 字符串格式化 ​ 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 ​ print(' %s is boy'%('tom')) ----> ...

  5. INTERVAL 用法 mysql

    原文:https://blog.csdn.net/sqlquan/article/details/82699237 做个例子描述吧,也许更易于理解. 准备: 1.建表 create table INT ...

  6. 个人项目 wc(java实现)

    一.Github网址: https://github.com/Clarazhangbw/Wc.exe 二.PSP表 PSP2.1 Personal Software Process Stages 预估 ...

  7. 【等待事件】等待事件系列(5.1)--Enqueue(队列等待)

    [等待事件]等待事件系列(5.1)--Enqueue(队列等待)   1  BLOG文档结构图   2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...

  8. package-lock.json的作用(转载)

    package-lock.json 文件的作用  来源 :https://www.cnblogs.com/kugeliu/p/9153775.html npm5之后安装文件之后会多出一个package ...

  9. MySQL DDL--MySQL 5.7版本Online DDL操作

    主键索引维护 1.新增主键索引 ## 可以使用ALGORITHM=INPLACE+LOCK=NONE方式,操作期间允许读写. ALTER TABLE tb001 ADD PRIMARY KEY (ID ...

  10. MySQL Percona Toolkit--pt-osc与online DDL选择

    pt-osc和online ddl选择 1.如果表存在触发器,不能使用pt-osc.2.如果新增唯一索引,不建议使用pt-osc,以免数据丢失.3.修改索引.外键.列名时,优先选择使用ALGORITH ...