[NOIp2018提高组]旅行:

题目大意:

一个\(n(n\le5000)\)个点,\(m(m\le n)\)条边的连通图。可以从任意一个点出发,前往任意一个相邻的未访问的结点,或沿着第一次来这个点的边返回。需要遍历每一个点。没经过一个新的结点,就将这个结点写下来。最终可以得到一个序列。求字典序最小的序列。

思路:

对于树的情况,显然从\(1\)出发,每次从字典序最小的相邻结点DFS即可。

对于有环的情况,由于环只有一个,我们可以将环找出来,枚举删掉环上的每一条边,然后按树的情况求解即可。

时间复杂度\(\mathcal O(n^2)\)。

源代码:

#include<set>
#include<stack>
#include<cstdio>
#include<cctype>
#include<vector>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=5001;
struct Edge {
int u,v;
};
Edge edge[N];
std::vector<std::pair<int,int> > g[N];
bool vis[N],mark[N];
std::stack<std::pair<int,int> > stk;
void dfs(const int &x,const int &par) {
vis[x]=true;
for(unsigned i=0;i<g[x].size();i++) {
const int &y=g[x][i].first;
if(y==par) continue;
stk.push(std::make_pair(x,g[x][i].second));
if(!vis[y]) {
dfs(y,x);
} else {
int z;
do {
z=stk.top().first;
mark[stk.top().second]=true;
stk.pop();
} while(z!=y);
throw 0;
}
stk.pop();
}
}
std::set<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].insert(v);
e[v].insert(u);
}
inline void del_edge(const int &u,const int &v) {
e[u].erase(v);
e[v].erase(u);
}
int s[N],ans[N];
void solve(const int &x,const int &par) {
s[++s[0]]=x;
for(std::set<int>::iterator i=e[x].begin();i!=e[x].end();i++) {
const int &y=*i;
if(y==par) continue;
solve(y,x);
}
}
inline bool check(int a[],int b[],const int &n) {
for(register int i=1;i<=n;i++) {
if(a[i]<b[i]) return true;
if(a[i]>b[i]) return false;
}
return false;
}
int main() {
const int n=getint(),m=getint();
for(register int i=0;i<m;i++) {
const int &u=edge[i].u=getint();
const int &v=edge[i].v=getint();
g[u].push_back(std::make_pair(v,i));
g[v].push_back(std::make_pair(u,i));
}
for(register int i=0;i<m;i++) {
add_edge(edge[i].u,edge[i].v);
}
if(m==n-1) {
solve(1,0);
for(register int i=1;i<=n;i++) {
printf("%d%c",s[i]," \n"[i==n]);
}
return 0;
}
try {
dfs(1,0);
} catch(...) {}
std::fill(&ans[1],&ans[n]+1,INT_MAX);
for(register int i=0;i<m;i++) {
if(!mark[i]) continue;
del_edge(edge[i].u,edge[i].v);
s[0]=0;
solve(1,0);
if(check(s,ans,n)) {
std::copy(&s[1],&s[n]+1,&ans[1]);
}
add_edge(edge[i].u,edge[i].v);
}
for(register int i=1;i<=n;i++) {
printf("%d%c",ans[i]," \n"[i==n]);
}
return 0;
}

[NOIp2018提高组]旅行的更多相关文章

  1. [NOIP2018 提高组] 旅行

    考虑如果我们要回溯的话,一定要把非环上的子树都搜索完. 而在环上的一个地方回溯,相当于把环上的下一个点置于所有环的顺序的最后. 所以我们只有在环上遇到环上的最大点时且周围的点都比这个点小时非正常回溯即 ...

  2. [NOIp2018提高组]赛道修建

    [NOIp2018提高组]赛道修建 题目大意: 给你一棵\(n(n\le5\times10^4)\)个结点的树,从中找出\(m\)个没有公共边的路径,使得第\(m\)长的路径最长.问第\(m\)长的路 ...

  3. [NOIp2018提高组]货币系统

    [NOIp2018提高组]货币系统 题目大意: 有\(n(n\le100)\)种不同的货币,每种货币的面额为\([1,25000]\)之间的一个整数.若两种货币系统能够组合出来的数是相同的的,那我们就 ...

  4. [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路

    [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...

  5. NOIP2018提高组省一冲奖班模测训练(六)

    NOIP2018提高组省一冲奖班模测训练(六) https://www.51nod.com/Contest/ContestDescription.html#!#contestId=80 20分钟AC掉 ...

  6. NOIP2018提高组省一冲奖班模测训练(五)

    NOIP2018提高组省一冲奖班模测训练(五) http://www.51nod.com/Contest/ContestDescription.html#!#contestId=79 今天有点浪…… ...

  7. NOIP2018提高组金牌训练营——动态规划专题

    NOIP2018提高组金牌训练营——动态规划专题 https://www.51nod.com/Live/LiveDescription.html#!#liveId=19 多重背包 二进制优化转化成01 ...

  8. NOIP2018提高组省一冲奖班模测训练(四)

    NOIP2018提高组省一冲奖班模测训练(四) 这次比赛只AC了第一题,而且花了40多分钟,貌似是A掉第一题里面最晚的 而且还有一个半小时我就放弃了…… 下次即使想不出也要坚持到最后 第二题没思路 第 ...

  9. NOIP2018提高组省一冲奖班模测训练(三)

    NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...

随机推荐

  1. Python(文件操作实例)

    给定一个文件:以及给定的字符,比如“a”; 统计字符个数:(可选) # 文件的打开操作f = open("wyl.txt","r")# 文件的读取操作conte ...

  2. GAN-生成对抗网络原理

    最近一直在看GAN,我一直认为只有把博客看了一遍,然后再敲一遍.这样才会有深刻的感悟. GAN(生成式对抗网络)(GAN, Generative Adversarial Networks )是一种深度 ...

  3. SpringBoot整合Kafka

    一.准备工作 提前启动zk,kafka,并且创建一个Topic("Hello-Kafk") bin/kafka-topics.sh --create --zookeeper 192 ...

  4. Zabbix 3.2.6通过SNMP和iDRAC监控DELL服务器

    https://www.cnblogs.com/saneri/p/7772641.html

  5. AspNetCore MVC + Vue.Js 项目搭建

    1.准备 全文重点在于搭建环境,其他相关知识点请百度. VS2017 升级到最新的版本 安装 net core 2.0 安装 npm (npm相关使用请百度或咨询前端小伙伴) 全局安装 webpack ...

  6. BZOJ 1706

    题解: 倍增+floyd 首先这题比较容易想到是把每个点拆点做dij 但是这样复杂度是knlogn的 这道题的k较大,所以不行 我们考虑到每走一步,其实就是在进行一次floyd 而这个可以看成矩阵乘法 ...

  7. 【CF662C】Binary Table(FWT)

    [CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...

  8. 一起学Hadoop——实现两张表之间的连接操作

    ---恢复内容开始--- 之前我们都是学习使用MapReduce处理一张表的数据(一个文件可视为一张表,hive和关系型数据库Mysql.Oracle等都是将数据存储在文件中).但是我们经常会遇到处理 ...

  9. Zabbix监控Nginx性能状态

    Nginx在生产环境中的应用越来越广泛,所以需要对nginx的性能状态做一些监控,从而发现故障隐患,Ngnx的监控指标可分为:基本活动指标,错误指标,性能指标 监控Nginx思路: 1)首先,要想监控 ...

  10. net core体系-API-1Ocelot-(1)概要

    从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问web api时, ...