题目链接

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. Unity - LayerMask简析

    本文简述了LayerMask的定义,后通过项目实战充分解析 LayerMask中的GetMask.LayerToName.NameToLayer 等函数的使用方法及其注意事项. 项目地址:3D坦克大战 ...

  2. mongoDB对没有字段的记录新增字段

    db.getCollection('ClassRecordOneDetail').updateMany({'synState':{'$exists':false}},{'$set':{'synStat ...

  3. Dockerfile构建jar镜像

    dockerDockerfilejar包docker-compose 一.安装docker和compose 二.准备jar包 三.编写配置文件 1. Dockerfile 2. docker-comp ...

  4. Linux系统快速入门方法

    相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什么要学习Linux,有的人是因为兴趣 ...

  5. FI-BTEs增强FIBF

    https://wenku.baidu.com/view/8a31a4bafd0a79563c1e72f6.html 1.事务码FIBF 2.激活

  6. Js 打印 div

    var wind = window.open("", 'newwindow', 'height=700, width=1000, top=100, left=100, toolba ...

  7. Linux目录结构说明

    文件系统层级标准(filesystem hierarchy standard,FHS). http://www.pathname.com/fhs/pub/fhs-2.3.html 以下是对这些目录的解 ...

  8. CentOS7安装MySQL5.7及Tomcat8.5

    在CentOS7服务器上部署FR项目应用 一.安装CentOS-7_x86_64 1.CentOS7:带GUI的服务器(FTP服务器.JAVA平台.兼容性程序库.开发工具.安全性工具.系统管理工具): ...

  9. 自动化运维-ansible入门篇

    1.ansible配置 什么是Ansible IT自动化工具 依赖于现有的操作系统凭证来访问控制远程机器 简单易用.安全可靠 Ansible可以完成哪些任务 配置系统 开发软件 编排高级的IT任务 A ...

  10. mysql表的连接

    目录 1.笛卡尔积:将两表所有的数据一一对应,生成一张大表 2.连表查询 1.inner join 内连接 2.left join 左连接(left join左边的表为主表,主表记录必须全部显示,辅表 ...