题目链接

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. Delphi中AssignFile函数

    procedure TForm1.SaveLog(sFlag:string;MSG:string);var QF1:Textfile;         ----声明文本文件类型 Qfiletmp,sP ...

  2. C# vb .net实现相机视图效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的相机视图效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  3. idea使用git进行项目管理

    第一部分: 安装 1. 下载地址:  https://git-scm.com/download/win; 如果速度慢, 使用 迅雷下载; 2. 点击安装, 然后下一步, 直到下面这个页面: 建议: 按 ...

  4. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器    定义:       ...

  5. C#中的委托、事件及事件的订阅

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. 【开发工具】- 推荐一款好用的文本编辑器[Sublime Text]

    作为一个程序员除了IDE外,文本编辑器也是必不可少的一个开发工具.之前一直在用的是NotePad++.EditPlus,这两款编辑器,但是总感觉差点什么,昨天在知乎上看到有人推荐Sublime Tex ...

  7. Oracle中nlssort()函数排序功能

    转自:https://www.iteye.com/blog/libaxiaoyuan-2199851 Oracle9i之前,中文是按照二进制编码进行排序的.在oracle9i中新增了按照拼音.部首.笔 ...

  8. index.jsp乱码问题的解决

    我们在做java项目的时候,都会有个首页,一般就是index.jsp,然后在index.jsp中引入相关的文件,一般也是引入打包过后的相关资源文件. 当index.jsp上面的中文出现乱码的时候,就需 ...

  9. Gitlab创建一个项目(二)创建新用户以及分配项目

    Gitlab创建一个项目(一) 1.进入gitlab控制台 2.点击“新建用户” 3.点击“Edit”,创建初始密码 4.分配项目,首页进入项目 5.进入Members菜单 6.选择用户 7.赋予权限 ...

  10. Python入门篇-functools

    Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.reduce方法 reduce方法,顾名思义就是减少 reduce(function,se ...