【洛谷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# vb .net实现淡色效果滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的淡色效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- Matlab原型模式
原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象.Matlab面向对象编程有两种类,一种是Value Class,一种是Ha ...
- 2019-07-24 PHP中mysql_fetch_assoc 和 mysql_fetch_array 有什么区别?
mysql_fetch_assoc() 函数从结果集中取得一行作为关联数组 来看下面的例子: 数据库中有上述几条数据,一般我们想取用就要按照如下代码: $con = mysql_connect('12 ...
- redux reducer笔记
踩坑一,reducer过于抽象 reducer写得没那么抽象也不会有人怪你的.^_^ reducer其实只有一个,由不同的reducer composition出来的.所以, reducer的父作用域 ...
- Oracle队列实现
Oracle队列实现 -- 核心技术点:for update 创建测试表 create table t ( id number primary key, processed_flag va ...
- DataPipeline如何实现数据质量管理?
数据质量管理已经成为数据治理的重要组成部分.高质量的数据是企业进行决策的重要依据. DataPipeline数据质量平台整合了数据质量分析.质量校验.质量监控等多方面特性, 以保证数据质量的完整性.一 ...
- 大数据集群环境搭建之一 Centos基本环境准备
首先需要准备的软件都有:Centos系统.SecureCRT 8.5.VMware Workstation Pro.jdk-8u172-linux-x64.tar.gz基本上这个软件就是今天的战场. ...
- 关于小程序授权地理位置(wx.getLocation + 用户体验)
wx.getLocation 如果用户曾点击过一次 “确认授权” , 那么再次调用该接口时将不会出现弹出框(可以直接拿到经纬度) 关于用户体验: 在 onLoad 中判断: 如果用户之前“没有触发过“ ...
- CASE WHEN 函数
--Case函数: --有两种格式: -- 1.简单Case函数. -- 2.Case搜索函数. --1.简单Case函数: -- CASE [COLUMN_NAME] -- WHEN ['条件参数' ...
- iOS 测试在应用发布前后的痛点探索以及解决方案
作者-芈 峮 前言 iOS 开发从 2010 年开始在国内不断地升温,开发和测试相关的问题不绝于耳.iOS 测试主要涉及哪些内容?又有哪些挑战呢?带着疑问我们开始第一个大问题的讨论. iOS 测试的范 ...