【洛谷P5049】旅行(数据加强版)
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】旅行(数据加强版)的更多相关文章
- [codevs1048]石子归并&[codevs2102][洛谷P1880]石子归并加强版
codevs1048: 题目大意:有n堆石子排成一列,每次可合并相邻两堆,代价为两堆的重量之和,求把他们合并成一堆的最小代价. 解题思路:经典区间dp.设$f[i][j]$表示合并i~j的石子需要的最 ...
- 洛谷 P5022 旅行
今天换标题格式了,因为感觉原版实在有点别扭…… 还是直接上题板,看完题再讲吧: 对了有个小细节没说,m一定是等于n或者等于n-1的. 这题是2018年提高组的真题哦!被我肝了2天肝出来了,2天……(真 ...
- 洛谷 P6031 - CF1278F Cards 加强版(推式子+递推)
洛谷题面传送门 u1s1 这个推式子其实挺套路的吧,可惜有一步没推出来看了题解 \[\begin{aligned} res&=\sum\limits_{i=0}^ni^k\dbinom{n}{ ...
- 洛谷 P1515 旅行
P1515 旅行 题目描述 你要进行一个行程为7000KM的旅行,现在沿途有些汽车旅馆,为了安全起见,每天晚上都不开车,住在汽车旅馆,你手里现在已经有一个旅馆列表,用离起点的距离来标识,如下: 0, ...
- 洛谷——P2082 区间覆盖(加强版)
P2082 区间覆盖(加强版) 题目描述 已知有N个区间,每个区间的范围是[si,ti],请求出区间覆盖后的总长. 输入输出格式 输入格式: N s1 t1 s2 t2 …… sn tn 输出格式: ...
- 洛谷P1137 旅行计划
P1137 旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市,并制 ...
- 洛谷 P1137 旅行计划
旅行计划 待证明这样dp的正确性. #include <iostream> #include <cstdio> #include <cstring> #includ ...
- 洛谷——P1137 旅行计划
https://www.luogu.org/problem/show?pid=1137 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出 ...
- 洛谷P5022 旅行 题解
前面几个代码都是部分分代码,最后一个才是AC了的,所以最后一个有详细注释 安利一发自己的Blog 这是提高组真题,233有点欧拉回路的感觉. 题目大意: 一个 连通 图,双向边 ,无重边 , 访问图中 ...
随机推荐
- C#静态字段的两个用处
静态字段的2个常用方法 (1)记录已实例化的对象的个数 (2)存储必须在所有实例化之间共享的值 (1)记录已实例化的对象的个数 现在某个培训机构啊,要开设一个学理发的班,计划招5人,只要人数够5人就开 ...
- 中控考勤机使用 zkemkeeper SDK订阅考勤数据事件失效解决方式
问题 前同事编写的对中控考勤机数据集成项目当中,打卡数据不能实时进行上传到平台当中,一直靠定时全量上传来同步数据. 阅读代码后,发现代码中有实时上传数据的逻辑,但是运行一段时间后,中控zkemkeep ...
- C#设计模式之12:中介者模式
中介者模式 在asp.net core中实现进程内的CQRS时用mediatR是非常方便的,定义command,然后定义commandhandler,或者notification和notificati ...
- 重新学习Spring一--Spring在web项目中的启动过程
1 Spring 在web项目中的启动过程 Spring简介 Spring 最简单的功能就是创建对象和管理这些对象间的依赖关系,实现高内聚.低耦合.(高内聚:相关性很强的代码组成,既单一责任原则:低耦 ...
- linq根据英文首字母姓名排序
names.Sort((a, b) => a.name.CompareTo(b.name));
- Python的virtualenv管理
原文链接 虚拟环境 Python 开发中所谓的虚拟环境,就是为 Python 版本及第三方库创建独立的开发环境,使不同项目之间互不干扰.借助于虚拟环境,我们可以在同一台电脑上构建出项目 A 在基于 P ...
- 换个语言学一下 Golang (9)——结构体和接口
基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,G ...
- 关于zynq系列板卡设计VREFP_0参考电压的疑问及解答
使用板卡:Z-turn Board 芯片:Xilinx Zynq-7010/7020处理器 有工程师在试用zynq系列Z-turn Board时提出:在原理图P3页 Bank0上VREFP_0端接地的 ...
- hadoop细节 -> 持续更新
Hdfs: hdfs写流程: 客户端通过DistributedFileSystem请求namenode上传文件 Namenode进行检查,比如父路径 文件本身,是否允许上传 Namenode相应信 ...
- 证券secuerity经济术语
证券按其性质不同,证券可以分为证据证券.凭证证券和有价证券三大类.证据证券只是单纯地证明一种事实的书面证明文件,如信用证.证据.提单等:凭证证券是指认定持证人是某种私权的合法权利者和持证人纪行的义务有 ...