题目描述

小$Y$是一个爱好旅行的$OIer$。她来到$X$国,打算将各个城市都玩一遍。
小$Y$了解到,$X$国的$n$个城市之间有$m$条双向道路。每条双向道路连接两个城市。不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路。并且,从任意一个城市出发,通过这些道路都可以到达任意一个其他城市。小$Y$只能通过这些道路从一个城市前往另一个城市。
小$Y$的旅行方案是这样的:任意选定一个城市作为起点,然后从起点开始,每次可以选择一条与当前城市相连的道路,走向一个没有去过的城市,或者沿着第一次访问该城市时经过的道路后退到上一个城市。当小$Y$回到起点时,她可以选择结束这次旅行或继续旅行。需要注意的是,小$Y$要求在旅行方案中,每个城市都被访问到。
为了让自己的旅行更有意义,小$Y$决定在每到达一个新的城市(包括起点)时,将它的编号记录下来。她知道这样会形成一个长度为$n$的序列。她希望这个序列的字典序最小,你能帮帮她吗?
对于两个长度均为$n$的序列$A$和$B$,当且仅当存在一个正整数$x$,满足以下条件时,我们说序列$A$的字典序小于$B$。
  $\bullet$对于任意正整数$1\leqslant i\leqslant x$,序列$A$的第$i$个元素$A_i$和序列$B$的第$i$个元素$B_i$相同。
  $\bullet$序列$A$的第$x$个元素的值小于序列$B$的第$x$个元素的值。


输入格式

输入文件名为$travel.in$。
输入文件共$m+1$行。第一行包含两个整数$n,m$中间用一个空格分隔。
接下来$m$行,每行包含两个整数$u,v$,表示编号为$u$和$v$的城市之间有一条道路,两个整数之间用一个空格分隔。


输出格式

输出文件名为$travel.out$。
输出文件包含一行,$n$个整数,表示字典序最小的序列。相邻两个整数之间用一个空格分隔。


样例

样例输入1:

6 5
1 3
2 3
2 5
3 4
4 6

样例输出1:

1 3 2 5 4 6

样例输入2:

6 6
1 3
2 3
2 5
3 4
4 5
4 6

样例输出2:

1 3 2 4 5 6


数据范围与提示

对于全部测试数据,$1\leqslant n\leqslant 5\times 10^3$,且$m=n-1$或$m=n$。保证$1\leqslant u,v\leqslant n$。
对于不同的测试点,我们约定数据的规模如下:

加强版数据范围:

对于$100\%$的数据和所有样例,$1\leqslant n\leqslant 500000$且$m=n-1$或$m=n$。
具体规定详见正常版本(除$testcase11-13$)


题解

$\Theta(n^2)$暴力不再赘述,找到环枚举断点即可。

考虑乱搞。

用$clock()$,防止超时。

发现$WA80$了。

$reverse$

时间复杂度:$\Theta(n^2)$。

期望得分:$70$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m;
bool vis[500001];
int dfn[500001],fa[500001],sta[500001],vec[500001],ans[500001],top,tim,cnt;
vector<int>e[500001];
void dfs(int x)
{
vis[x]=1;printf("%d ",x);
int t=e[x].size();
for(int i=0;i<t;i++)
if(!vis[e[x][i]])dfs(e[x][i]);
}
void tarjan(int x)
{
dfn[x]=++tim;
sta[++top]=x;
int t=e[x].size();
for(int i=0;i<t;i++)
{
if(dfn[e[x][i]])
{
if(dfn[e[x][i]]<dfn[x])continue;
int y=e[x][i];
vec[++cnt]=y;
while(y!=x)
{
y=fa[y];
vec[++cnt]=y;
}
}
else
{
fa[e[x][i]]=x;
tarjan(e[x][i]);
}
}
}
void dfs(int x,int l,int r)
{
vis[x]=1;sta[++top]=x;
int t=e[x].size();
for(int i=0;i<t;i++)
{
if((x==l&&e[x][i]==r)||(x==r&&e[x][i]==l))continue;
if(!vis[e[x][i]])dfs(e[x][i],l,r);
}
}
bool judge()
{
for(int i=1;i<=top;i++)
{
if(ans[i]>sta[i])return 1;
if(ans[i]<sta[i])return 0;
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++)sort(e[i].begin(),e[i].end());
if(m==n-1)dfs(1);
else
{
tarjan(1);top=0;
reverse(vec+1,vec+cnt+1);
dfs(1,vec[1],vec[cnt]);
memcpy(ans,sta,sizeof(sta));
for(int i=1;i<cnt;i++)
{
memset(vis,0,sizeof(vis));
top=0;dfs(1,vec[i],vec[i+1]);
if(judge())memcpy(ans,sta,sizeof(sta));
if(clock()>910000)break;
}
for(int i=1;i<=top;i++)printf("%d ",ans[i]);
}
return 0;
}

rp++

[NOIP2018]:旅行(数据加强版)(基环树+搜索+乱搞)的更多相关文章

  1. bzoj 2594: [Wc2006]水管局长数据加强版 动态树

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 934  Solved: 291[Submit][Sta ...

  2. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  3. [luoguP2325] [SCOI2005]王室联邦(树分块乱搞)

    传送门 想了半小时,没什么思路.. 看了题解,是个叫做树分块的奇奇怪怪的操作.. 题解 树分块的研究 #include <cstdio> #include <cstring> ...

  4. BZOJ 4032 trie树+各种乱搞

    思路 : 先对b 的所有后缀建立trie树 第一问 暴力枚举a串的起点 在trie树上跑 找到最短的 第二问 也是暴力枚举a串的起点 a和b顺着暴力匹配就好 第三问 求出来a在第i个位置 加一个字母j ...

  5. 洛谷P4337 [ZJOI2018]线图(状压+搜索+乱搞)

    题面 传送门 题解 妈呀调了我整整一天-- 题解太长了不写了可以去看\(shadowice\)巨巨的 //minamoto #include<bits/stdc++.h> #define ...

  6. 洛谷P5022&P5049 旅行(及其数据加强版)

    旅行(不是加强版) 加强版 加强版数据范围: 我们注意到 也就是说要么是个树,要么是个基环树 60pts 这60分是个树,可以简单的贪心想到每次都走子树中编号最小的那个,并且把1作为根 dfs练手题 ...

  7. P5022 旅行[基环树]

    以后必须学会面向数据编程!看半天题目不知道咋写直接爆搜,结果分少的可怜,还不如直接贪搞个60分. 观察数据,发现图至多存在一个环. 显然,如果没有环,这个题不跟你多bb,直接贪就完事了,线性复杂度. ...

  8. 洛谷P1120 小木棍 [数据加强版](搜索)

    洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...

  9. [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)

    题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...

随机推荐

  1. element-ui当中table组件的合并行和列的属性:span-method的用法

    背景 最近基本上都是以Vue来构建项目,而UI框架也基本上都是使用的element-ui,所以里面组件用的也是越来越多,今天想记录的是非常非常小的一个属性的用法. Table组件 Table组件用了真 ...

  2. Jmeter4.0---- 修改jmeter源代码(18)

    1.说明 jmeter本身功能很强大,但是在使用的时候我们会发现有些想法jmeter无法帮我们实现,这个时候就需要我们细节去修改一下它的源代码,来满足我们的需求. * 仅供参考 2.步骤 第一步: j ...

  3. C++性能榨汁机之虚函数的开销

    C++性能榨汁机之虚函数的开销 来源  http://irootlee.com/juicer_vtable/ 虚函数的实现 虽然C++标准并没有规定编译器实现虚函数的方式,但是大部分编译器均是采用了虚 ...

  4. DA_03_linux网络配置及其远程连接

    一: 修改Linux的基本配置 直接运行:setup,根据提示修改 1.修改主机名:vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=shizhan1 ...

  5. sql查询数据结果发送到邮箱

    #!/bin/bash user=root password=xx dbname=xx DATE=`date +%F` #注意:此处mysql要用全路劲,否则计划任务会执行失败 /mydata/mys ...

  6. python+Appium自动化:app滑动操作swipe

    swipe Appium使用滑动操作用到了swipe方法,定义如下: swipe(self, start_x, start_y, end_x, end_y, duration=None) 从一个点滑动 ...

  7. vue store获取值时 Computed property "activeTag" was assigned to but it has no setter.

    出现原因: element-ui中 el-tab绑定的值在切换tab时会自动修改 而activeTag是从store中获取的值,不能直接修改 要添加给它绑定上set   <el-tabs cla ...

  8. 选择排序Selection_Sort

    基本思想:和冒泡排序.直接插入排序并称为三大简单排序算法.显然,说明它们都很简单

  9. 软件测试能满足测试的sql

    作为一个软件测试工程师,我们在测试过程中往往需要对数据库数据进行操作,但是我们的操作大多以查询居多,有时会涉及到新增,修改,删除等操作,所以我们其实并不需要对数据库的操作有特别深入的了解,以下是我在工 ...

  10. 1.打开windows中功能的快捷方式

    1.打开组策略 命令:gpedit.msc 2.打开注册表 命令:regedit 3.快速打开本地安全组策略 命令:secpol.msc 4.打开服务 命令:services.msc 5.系统退域的时 ...